我是pivot函数的新手,我正在尝试使用它来创建包含现有数据的新列。在这种情况下,列应基于当前月份和整月的每个月的数据。字段Months
包含YYYYMM格式的月份。
我使用以下查询:
SELECT *
FROM (
SELECT
[Num]
,[Channel]
,[Months]
,[Currency]
,[Value]
FROM [Test].[dbo].[Decision_Details]
WHERE
(Key_Name = 'Decision'
OR Key_Name = 'LastCycle')
) as s
PIVOT
(
SUM([Value])
FOR [Months] IN ([201705], [201706], [201708], [201709], [201710], [201711], [201712])
)AS pvt
并收到以下输出:
这是正确的输出,但我需要基于当前月份(201705)及以后的数据,而不是硬编码。
我尝试将LEFT(CONVERT(varchar, GetDate(),112),6)
添加到数据透视查询中,但它似乎不像我想要的那样工作。
有关如何将此信息纳入我的查询的任何建议吗?
更新
使用Dynamic Pivot管理每个月:
答案 0 :(得分:0)
如果有人有兴趣,我设法通过使用以下查询来解决我的问题。 (请注意,这里可能存在改进的空间,但这对我有用):
DECLARE @cols2 AS NVARCHAR(MAX),
@query2 AS NVARCHAR(MAX);
select @cols2 = STUFF((SELECT distinct ',' + QUOTENAME(c.Months)
FROM [Test].[dbo].[Decision_Details] c
WHERE (Months >= LEFT(CONVERT(varchar, (DATEADD(MONTH, -1, GETDATE())), 112),6)
AND Months <= LEFT(CONVERT(varchar, (DATEADD(MONTH, +6, GETDATE())), 112),6))
AND Key_Name = 'Decision'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query2 = 'SELECT Num, Channel, Currency, ' + @cols2 + ' from
(
select Key_name,
Num,
Channel,
Months,
Currency,
Value
from [Test].[dbo].[Decision_Details]
WHERE (Months >= LEFT(CONVERT(varchar, (DATEADD(MONTH, -1, GETDATE())), 112),6)
AND Months <= LEFT(CONVERT(varchar, (DATEADD(MONTH, +6, GETDATE())), 112),6))
AND Key_Name = ''Decision''
) x
pivot
(
MAX([Value])
for Months in (' + @cols2 + ')
) p '
execute(@query2)