UNPIVOTに動的に列名を渡す


10

次のデータを含むテーブルがあります

First         Second        Third         Fourth        Fifth         Sixth
2013-08-20    2013-08-21    2013-08-22    2013-08-23    2013-08-24    2013-08-25

そして使用 UNPIVOT

SELECT Data
    ,DATENAME(DW, Data) AS DayName
FROM Cal
UNPIVOT(Data FOR D IN (
            First,
            Second,
            Third,
            Fourth,
            Fifth,
            Sixth  )) AS unpvt

次の結果が得られます

Data        DayName
2013-08-20  Tuesday
2013-08-21  Wednesday
2013-08-22  Thursday
2013-08-23  Friday
2013-08-24  Saturday
2013-08-25  Sunday

ここで私の質問は、列名を動的にに渡しUNPIVOTて、テーブルの列が増加したときにステートメントを変更する必要がないようにすることです。

回答:


14

アンピボットする必要のある不明な数の列がある場合は、動的SQLの実装を調べる必要があります。

を使用sys.columnsして、calテーブル内のすべての列の名前を取得できます。次のクエリを使用すると、テーブルのすべての列のリストが表示されます。

select C.name
from sys.columns c
where c.object_id = OBJECT_ID('dbo.cal') 

これで、このクエリを一緒に使用FOR XML PATHして、実行する文字列に連結される名前のコンマ区切りのリストを作成できます。

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

最後に、このリストを取得して実行するクエリ文字列に配置すると、完全なクエリは次のようになります。

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

set @query 
  = 'select data, datename(dw, data) dayname
     from cal
     unpivot
     (
        data
        for d in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

SQL Fiddle with Demoを見る

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.