Мое предложение - немного сократить исходный запрос.Если я не совсем ошибаюсь, это можно записать следующим образом:
WITH
OINM_Base (ItemCode, [Month], OutQty) AS (
SELECT
ItemCode,
CASE GROUPING(MONTH(DocDate))
WHEN 1 THEN 0 ELSE MONTH(DocDate)
END,
SUM(OutQty)
FROM OINM
WHERE TransType <> '67' AND YEAR(DocDate) = YEAR(GETDATE()) -- change this for the previous year
GROUP BY ItemCode, ROLLUP(MONTH(DocDate))
),
OINM_Data (ItemCode, [Year], JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, [DEC]) AS (
SELECT ItemCode, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]
FROM OINM_Base
PIVOT (SUM(OutQty) FOR [Month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])) pvt
),
OITW_Data (ItemCode, [On Hand], [On Order], [Committed]) AS (
SELECT ItemCode, SUM(OnHand), SUM(OnOrder), SUM(IsCommited)
FROM OITW
GROUP BY ItemCode
)
SELECT
tm.ItemCode,
tm.ItemName AS [Description],
tm.CardCode AS Vendor,
tw.[On Hand], tw.[On Order], tw.[Committed],
tw.[On Hand] + tw.[On Order] - tw.[Committed] AS Available,
tm.AvgPrice AS [Unit Cost],
tw.[On Hand] * tm.AvgPrice AS [Value $],
nm.[Year], nm.JAN, nm.FEB, nm.MAR, nm.APR, nm.MAY, nm.JUN, nm.JUL, nm.AUG, nm.SEP, nm.OCT, nm.NOV, nm.[DEC]
FROM OITM tm
INNER JOIN OITW_Data tw ON tm.ItemCode = tw.ItemCode
LEFT OUTER JOIN OINM_Data nm ON tm.ItemCode = nm.ItemCode;
Это работает следующим образом:
Данные в OINM
ограничены указанным годом, суммируяOutQty
значений за месяц и создание итога за год, который помечен как месяц номер 0 (CTE OINM_Base
).С помощью запроса PIVOT
суммы, появляющиеся в разных строках, превращаются в столбцы (CTE OINM_Data
).Агрегация для данных OITW также выполняется отдельно (CTE OITW_Data
).
И OINM_Data
, и OITW_Data
наконец объединяются с данными, формирующими основные строки из OITM
.Здесь окончательные расчеты сделаны (Available
и Value $
).
Теперь, чтобы изменить запрос на возврат за предыдущий год, нужно изменить только одну вещь (см. Мой комментарий "измените это для предыдущего года"), а именно:
YEAR(GETDATE())
должен быть заменен на YEAR(GETDATE()) - 1
.