sql >> データベース >  >> RDS >> Sqlserver

SQLServerの「ピボット」を使用して行を列に変換する

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

    週が不明な場合は動的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 |
    


    1. 予算内での分割

    2. Asinh()がPostgreSQLでどのように機能するか

    3. OBJECTPROPERTY()を使用して、SQLServerの外部キーによってテーブルが参照されているかどうかを確認します。

    4. ORA-29280の解決方法:無効なディレクトリパス