SQL - частично слишком высокие значения, как результат - синтаксическая проблема?
У меня есть запрос планирования ресурсов, который должен показывать фактическую работу, оставшуюся работу и общую работу на ресурс за финансовый месяц за текущий год.
Однако во всех этих строках, где есть оставшаяся работа - т.е. в текущем месяце или в будущем месяце, но не в прошлом месяце, - показаны слишком высокие значения для работы.
Т.е. на январь 2016 года все значения (оставшиеся, фактические и итоговые работы) являются правильными. С февраля по декабрь 2016 года ни одно из значений не является правильным.
Слишком высокие значения не умножаются на один и тот же коэффициент, и ко всем ошибочным значениям не добавляется постоянное число. Вот почему я подозреваю, что может быть какая-то проблема разветвления (умножение столбца на другой или количество раз, когда один элемент появляется), вызванный многочисленными объединениями.
Мне интересно, является ли это проблемой синтаксиса или я запрашиваю неправильные поля. Если бы вы могли сказать мне, есть ли что-то в моем запросе, что вызывает сбой суммирования сумм, было бы здорово, если бы вы могли сообщить мне:)
Далее, возможно, важная информация, чтобы отметить:
Работа агрегируется из проектов, заданий и задач, так как запрос предназначен для показа этого уровня детализации. Однако я удалил это из SELECT и GROUP, чтобы немного сузить запрос с целью обнаружения ошибки.
Первоначально работа записывается во времени, а не в бюджетное время. Поэтому в запросе есть часть, соединяющая график рабочего времени с таблицей, которая содержит как нормальный, так и финансовый календарь. В этот момент запроса у меня возникла проблема "разветвления", поэтому я поместил отдельный оператор SELECT в LEFT JOIN. Однако тогда все значения (а не только текущие / будущие значения) были значительно выше. Оператор sub-SELECT исправил эту проблему, но все еще есть ошибочные значения...
SELECT
MSP_EpmResource_UserView.ResourceName,
totals.[FiscalMemberKeyPeriod] AS FiscalMonth,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentWork) AS Work,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentActualWork) AS ActualWork,
SUM(MSP_EpmAssignmentByDay_UserView.AssignmentRemainingWork) AS RemainingWork
FROM MSP_EpmResource_UserView
INNER JOIN ((MSP_EpmTask_UserView
INNER JOIN MSP_EpmProject_UserView
ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmProject_UserView.ProjectUID)
INNER JOIN MSP_EpmAssignment ON MSP_EpmTask_UserView.ProjectUID = MSP_EpmAssignment.ProjectUID
AND MSP_EpmTask_UserView.TaskUID = MSP_EpmAssignment.TaskUID)
ON MSP_EpmResource_UserView.ResourceUID = MSP_EpmAssignment.ResourceUID
INNER JOIN MSP_EpmAssignmentByDay_UserView
ON MSP_EpmAssignment.AssignmentUID = MSP_EpmAssignmentByDay_UserView.AssignmentUID
LEFT JOIN (SELECT MSP_TimeByDay_OlapView.CalendarMemberKeyMonth, MSP_TimeByDay_OlapView.FiscalMemberKeyPeriod, MSP_TimeByDay_OlapView.CalendarMemberKeyYear
FROM MSP_TimeByDay_OlapView
GROUP BY CalendarMemberKeyMonth, FiscalMemberKeyPeriod, CalendarMemberKeyYear)
AS totals
ON MONTH (MSP_EpmAssignmentByDay_UserView.TimeByDay) = totals.CalendarMemberKeyMonth
WHERE (MSP_EpmAssignmentByDay_UserView.TimeByDay BETWEEN '2016-01-01' AND '2016-12-31')
AND totals.CalendarMemberKeyYear='2016'
GROUP BY
MSP_EpmResource_UserView.ResourceName,
totals.[FiscalMemberKeyPeriod]
ORDER BY
MSP_EpmResource_UserView.ResourceName