Попробуйте это решение. Поправь меня, если я ошибаюсь, но тебе не нужен динамический разворот, если ты знаешь, что хочешь месяцев от 1 до 13.
В первом CTE мы группируем данные по месяцам, затем вычисляем разницу каждого месяца по сравнению с текущим месяцем с помощью DATEDIFF MONTH
и, наконец, поворачиваем значения только для разниц месяца от 1 до 13.
IF OBJECT_ID('tempdb..#Data') IS NOT NULL
DROP TABLE #Data
CREATE TABLE #Data (
InvoiceDate DATE,
ItemCode INT,
Units INT)
INSERT INTO #Data (
InvoiceDate,
ItemCode,
Units)
VALUES
('2018-05-07', 123456, 20),
('2018-05-04', 123456, 5),
('2018-04-07', 123456, 10),
('2017-05-25', 123456, 50),
('2017-09-07', 123456, 40),
('2018-01-07', 123456, 35)
;WITH GroupedMonths AS
(
SELECT
ItemCode = D.ItemCode,
Year = DATEPART(YEAR, D.InvoiceDate),
Month = DATEPART(MONTH, D.InvoiceDate),
Units = SUM(D.Units),
InitialDate = DATEFROMPARTS(
DATEPART(YEAR, D.InvoiceDate),
DATEPART(MONTH, D.InvoiceDate),
1),
CurrentInitialDate = DATEFROMPARTS(
DATEPART(YEAR, GETDATE()),
DATEPART(MONTH, GETDATE()),
1)
FROM
#Data AS D
GROUP BY
D.ItemCode,
DATEPART(YEAR, D.InvoiceDate),
DATEPART(MONTH, D.InvoiceDate)
),
MonthRankings AS
(
SELECT
G.ItemCode,
G.Units,
MonthRanking = DATEDIFF(MONTH, G.InitialDate, G.CurrentInitialDate) + 1
FROM
GroupedMonths AS G
)
SELECT
T.ItemCode,
'01' = ISNULL(T.[1], 0),
'02' = ISNULL(T.[2], 0),
'03' = ISNULL(T.[3], 0),
'04' = ISNULL(T.[4], 0),
'05' = ISNULL(T.[5], 0),
'06' = ISNULL(T.[6], 0),
'07' = ISNULL(T.[7], 0),
'08' = ISNULL(T.[8], 0),
'09' = ISNULL(T.[9], 0),
'10' = ISNULL(T.[10], 0),
'11' = ISNULL(T.[11], 0),
'12' = ISNULL(T.[12], 0),
'13' = ISNULL(T.[13], 0)
FROM
MonthRankings AS R
PIVOT (
MAX(R.Units) FOR R.MonthRanking IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13])
) AS T