SQL - 在pivot函数中显示当前和未来月份的数据

时间:2017-05-29 14:02:35

标签: sql sql-server pivot getdate

我是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

并收到以下输出:

enter image description here

这是正确的输出,但我需要基于当前月份(201705)及以后的数据,而不是硬编码。

我尝试将LEFT(CONVERT(varchar, GetDate(),112),6)添加到数据透视查询中,但它似乎不像我想要的那样工作。

有关如何将此信息纳入我的查询的任何建议吗?

更新

使用Dynamic Pivot管理每个月:

enter image description here

1 个答案:

答案 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)

enter image description here