2017-09-12 8 views
1

私は現在ピボット、unpivotを使用して、最後の6つの利用可能な日付データを取得しようとしています。誰もこのクエリで私を助けることができますか? [Date]列のSQL Serverで日付をピボット&アンピボット機能

select * 
from #myTable 
unpivot (value for Area in (abc,def,fgh,ijk,klp)) up 
pivot (max(value) for [date] in (
##-- Here I need to get the last 6 available dates less than current date 
)) p 

データ型は、一つの領域のための私のデシベルの日付のDATE.

サンプル値あなたのサンプルデータから

2017-09-16, 
2017-09-09, 
2017-09-02, 
2017-08-26, 
2017-07-22, 
2017-07-01, 
2017-06-24, 
2017-06-11 

Sample table, with expected result

+0

最終6または最後の6?サンプルデータと期待される出力が良いでしょう。 – scsimon

+0

はい、各エリアに...サンプルテーブルを追加しましたが、同じ結果が期待されています..おかげで事前に... –

答えて

0

まあ、トップ6でしょうですAreaは列名なので、各領域で同じにしてください。その情報を使用して、元のピボットの後に動的なピボットを使用することができます。各エリアについて

declare @table table (TheDate date, abc int, def int, fgh int, ijk int, klp int) 
insert into @table 
values 
('20170916',1,2,34,4,5), 
('20170909',2,3,4,5,676), 
('20170902',6,7,8,8,9) 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

if object_id('tempdb..#staging') is not null drop table #staging 

select 
    Area 
    ,TheDate 
    ,Val 
into #staging 
from @table 
unpivot 
    (Val for Area in (abc,def,fgh,ijk,klp) 
    ) up 


--Get distinct values of the PIVOT Column/top 6 by date 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME(TheDate) 
FROM (SELECT DISTINCT TOP 6 TheDate FROM #staging ORDER BY TheDate DESC) AS TheDate 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT Area, ' + @ColumnName + ' 
    FROM #staging 
    PIVOT(SUM(Val) 
      FOR TheDate IN (' + @ColumnName + ')) AS PVTTable' 

--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 

See It In Action Here

+0

パーフェクト...すごく感謝しています.... –