Вычесть из суммы одного столбца в зависимости от дат в SQL

У меня есть таблица SQL с именем ресурса, именем супервизора, запланированным усилием, запланированной датой завершения, именем задачи

Я хочу получить выходные данные "Имя ресурса", "Имя супервизора" и "Плановые усилия", где "Плановые усилия" - это СУММА (общая) усилий для этого вычитания ресурса (минус) из "Конечных дат запланированных усилий", которые заканчиваются в следующем месяце.

Ниже приведен пример:

  • Ресурс А имеет общее усилие 125%
  • Выходные данные для запланированного усилия А к 31.05.2008 г. должны составлять 50% ((50+25)-(25+25))

  • Ресурс B имеет общее усилие 100%

  • Выход для запланированного усилия B к 31.05.2008 должен составить 50% (50-50)

Ниже приведен запрос, который я использую. Название ресурса, имя супервизора и планируемые усилия взяты из разных таблиц. Я использую Inner Join, чтобы объединить их. Текущая проблема, с которой я столкнулся, заключается в том, что запрос должен выдавать выходные данные только для тех ресурсов, чья сумма запланированных усилий составляет менее 80% после указанной даты, включая все условия, указанные в предложении where.

Declare @MonthStart Date
Declare @MonthFinish Date
Set @MonthFinish = '5/31/2018'
Select
r.resourcename AS [Resource Name]
--,ru.[Supervisor Name]
--,t.taskname AS [Project Name]
,SUM(a.assignmentpeakunits) AS [Occupied %]
from assignment a
Inner Join Task t on a.TaskUID = t.taskuid
Inner Join Resource R on a.resourceuid = R.ResourceUId
Inner Join Resource_UserView RU on a.resourceuid = ru.resourceuid
Where a.projectuid = '04D0A859-CFE4-E611-8109-0025B52F0120'
and a.assignmentfinishdate > @MonthFinish
and r.ResourceName <> 'Unassigned Resource'
and a.AssignmentPeakUnits < 80 
Group By r.ResourceName
Order by r.ResourceName

1 ответ

Решение

Кажется, вы думаете, что сложно. У вас есть эти строки для ресурса A:

плановая_фини_дата плановая_эффорт
2018-04-30            25%
2018-05-31            50%
2018-09-30            25%
2018-12-28            25%

Вы ясно даете понять, что в общей сложности 125% и что в 2018-05-31 будет сделано 25+50=75%, поэтому остаются 25+25=50%, и эти 50% вы хотите показать. Но независимо от того, какой общий процент, независимо от того, сколько сделано, вы просто хотите получить сумму процентов после указанной даты.

select
  resource_name,
  supervisor_name,
  sum(planned_effort) as total
from mytable
where planned_finish_date >  date '2018-05-31'
group by resource_name, supervisor_name
order by resource_name, supervisor_name;

(Кстати, ваша база данных не нормализована. Вы говорите, что на один ресурс может быть только один супервизор, но ваша таблица допускает использование разных супервизоров на один ресурс. Следовательно, это должны быть две таблицы: таблица рессорс с именем рессорса и именем супервизора и таблица вашего плана, но без имени руководителя.)

Другие вопросы по тегам