2017-05-29 56 views
0

我是一个新的透视函数,我试图用它来创建具有现有数据的新列。在这种情况下,这些列应基于当前月份和整个年份的每个月的数据。字段Months包含YYYYMM格式的月份。SQL - 在透视函数中显示当前和未来几个月的数据

我使用下面的查询:

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)添加到数据透视查询,但它似乎没有按照我希望的方式工作。

关于如何将这个到我的查询中的任何建议?

更新:

管理使用动态数据透视每月获得:

enter image description here

+1

一个SQL查询返回的固定列名。如果您想要灵活的名称,则需要使用动态SQL。尝试使用Google搜索:“SQL Server动态数据透视表”。 –

+0

谢谢,我会研究这个! – krynil

回答

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

相关问题