SQL Server で「ピボット」を使用して行を列に変換する 質問する

SQL Server で「ピボット」を使用して行を列に変換する 質問する

MS ピボット テーブルに関する情報を読みましたが、まだ正しく理解できていません。

作成中の一時テーブルがあり、列 1 は店舗番号、列 2 は週番号、列 3 は何らかの合計であるとします。また、週番号は動的ですが、店舗番号は静的です。

Store      Week     xCount
-------    ----     ------
102        1        96
101        1        138
105        1        37
109        1        59
101        2        282
102        2        212
105        2        78
109        2        97
105        3        60
102        3        123
101        3        220
109        3        87

次のようにピボット テーブルとして出力したいと思います。

Store        1          2          3        4        5        6....
----- 
101        138        282        220
102         96        212        123
105         37        
109

横に数字を、上部に週数を格納します。

ベストアンサー1

PIVOTSQL Server 2005 以降を使用している場合は、関数を使用してデータを行から列に変換できます。

週が不明な場合は動的 SQL を使用する必要があるようですが、最初はハードコードされたバージョンを使用して正しいコードを確認する方が簡単です。

まず、使用するテーブルの定義とデータを簡単に示します。

CREATE TABLE yt 
(
  [Store] int, 
  [Week] int, 
  [xCount] int
);
    
INSERT INTO yt
(
  [Store], 
  [Week], [xCount]
)
VALUES
    (102, 1, 96),
    (101, 1, 138),
    (105, 1, 37),
    (109, 1, 59),
    (101, 2, 282),
    (102, 2, 212),
    (105, 2, 78),
    (109, 2, 97),
    (105, 3, 60),
    (102, 3, 123),
    (101, 3, 220),
    (109, 3, 87);

値がわかっている場合は、クエリをハードコードします。

select *
from 
(
  select store, week, xCount
  from yt 
) src
pivot
(
  sum(xcount)
  for week in ([1], [2], [3])
) piv;

見るSQL デモ

週番号を動的に生成する必要がある場合、コードは次のようになります。

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

select @cols = STUFF((SELECT ',' + QUOTENAME(Week) 
                    from yt
                    group by Week
                    order by Week
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT store,' + @cols + ' from 
             (
                select store, week, xCount
                from yt
            ) x
            pivot 
            (
                sum(xCount)
                for week in (' + @cols + ')
            ) p '

execute(@query);

見るSQL デモ

week動的バージョンでは、列に変換される数値のリストを生成します。どちらも同じ結果になります。

| STORE |   1 |   2 |   3 |
---------------------------
|   101 | 138 | 282 | 220 |
|   102 |  96 | 212 | 123 |
|   105 |  37 |  78 |  60 |
|   109 |  59 |  97 |  87 |

おすすめ記事