2017-05-29 10 views
0

ピボット関数の新機能で、既存のデータを使用して新しい列を作成しようとしています。この場合、列は現在の月と1年間の各月のデータに基づいている必要があります。フィールド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

関連する問題