如果这是重复的话,请道歉,但我的方案非常具体到提供的示例。
这个PIVOT Logic导致它返回所有不需要的空值而不是只返回需要列的1行有什么问题。 (已经太长时间了。)
SELECT ENTITY_VAL, [12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1]
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY CONVERT(DATE, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, D) + 1, 0)),121) DESC) ID
,DATEPART(YEAR, D) YR
,DATEPART(MONTH, D) MNTH
--,RIGHT('00' + CAST(DATEPART(mm, D) AS VARCHAR(02)), 2) MNTH2
,CONVERT(DATE, D, 101) FIRSTOFMONTH
,CONVERT(DATE, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, D) + 1, 0)),121) LASTOFMONTH
, 1111111 ENTITY_VAL
FROM
(
SELECT D = DATEADD(MONTH, XM.RN, @StartDate)
FROM
(
SELECT TOP (DATEDIFF(MONTH, @StartDate, @CutoffDate))
RN = ROW_NUMBER() OVER (ORDER BY AO.[object_id])
FROM sys.all_objects AS AO
CROSS JOIN sys.all_objects AS AO2
-- on my system this would support > 5 million days
ORDER BY AO.[object_id]
) AS XM
) AS XY
--ORDER BY LASTOFMONTH ASC
) AS BASE
PIVOT
(
MAX(FIRSTOFMONTH) FOR ID IN ([12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1])
) AS PVT
我得到了这个(不是我想要的):
ENTITY_VAL 12 11 10 9 8 7 6 5 4 3 2 1
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1111111 2016-11-01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
1111111 NULL 2016-12-01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
1111111 NULL NULL 2017-01-01 NULL NULL NULL NULL NULL NULL NULL NULL NULL
1111111 NULL NULL NULL 2017-02-01 NULL NULL NULL NULL NULL NULL NULL NULL
1111111 NULL NULL NULL NULL 2017-03-01 NULL NULL NULL NULL NULL NULL NULL
1111111 NULL NULL NULL NULL NULL 2017-04-01 NULL NULL NULL NULL NULL NULL
1111111 NULL NULL NULL NULL NULL NULL 2017-05-01 NULL NULL NULL NULL NULL
1111111 NULL NULL NULL NULL NULL NULL NULL 2017-06-01 NULL NULL NULL NULL
1111111 NULL NULL NULL NULL NULL NULL NULL NULL 2017-07-01 NULL NULL NULL
1111111 NULL NULL NULL NULL NULL NULL NULL NULL NULL 2017-08-01 NULL NULL
1111111 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 2017-09-01 NULL
1111111 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 2017-10-01
而不是这个(我想要的):
ENTITY_VAL 12 11 10 9 8 7 6 5 4 3 2 1
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1111111 2016-11-01 2016-12-01 2017-01-01 2017-02-01 2017-03-01 2017-04-01 2017-05-01 2017-06-01 2017-07-01 2017-08-01 2017-09-01 2017-10-01
答案 0 :(得分:0)
我修好了,这是过多的栏目"膨胀" PIVOT。
更新了逻辑:
SELECT ENTITY_VAL, [12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1]
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY CONVERT(DATE, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, D) + 1, 0)),121) DESC) ID
,CONVERT(DATE, D, 101) FIRSTOFMONTH
,1111111 ENTITY_VAL
FROM
(
SELECT D = DATEADD(MONTH, XM.RN, @StartDate)
FROM
(
SELECT TOP (DATEDIFF(MONTH, @StartDate, @CutoffDate))
RN = ROW_NUMBER() OVER (ORDER BY AO.[object_id])
FROM sys.all_objects AS AO
CROSS JOIN sys.all_objects AS AO2
-- on my system this would support > 5 million days
ORDER BY AO.[object_id]
) AS XM
) AS XY
--ORDER BY LASTOFMONTH ASC
) AS BASE
PIVOT
(
MAX(FIRSTOFMONTH) FOR ID IN ([12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1])
) AS PVT
返回:
ENTITY_VAL 12 11 10 9 8 7 6 5 4 3 2 1
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1111111 2016-11-01 2016-12-01 2017-01-01 2017-02-01 2017-03-01 2017-04-01 2017-05-01 2017-06-01 2017-07-01 2017-08-01 2017-09-01 2017-10-01