14938


通常PIVOTは１つの列を行に変換できますが、  
複数の行を対象に変換することはできるのでしょうか。  
対象：SQL Server 2012

[code]

    TABLE：SALES
    店舗　| 売上月　| 売上金額 | 販売数
     A   | 2013年 |  1000 　|  100
     A   | 2014年 |  2000 　|  200
     A   | 2015年 |  3000 　|  300
     B   | 2014年 |  1000 　|  100
     B   | 2015年 |  3000 　|  300
     C   | 2015年 |  2000 　|  200
    
[/code]

以下のSQLで1行のみ売上を行列変換可能です。

[code]

    SELECT *
    FROM SALES
    PIVOT (
      SUM(売上金額) FOR 売上年 IN ([2013年], [2014年], [2015年])
    )
    
[/code]

売上金額と販売数の両方を行列変換する場合はどうすればよいのでしょうか。

[code]

    店舗 | 2013年_売上金額 | 2014年_売上金額 | 2015年_売上金額 | 2013年_販売数 | 2014年_販売数 |...
    A　　|　　  　 　1000　|　　       2000 |  　　　　　3000 | 　  　　　100 |   　　　　200 |　　　　300 |...
    
[/code]

WEBの情報を参考にしましたが、以下のSQLは動きませんでした。  
ASを利用して項目名が重複しないようにしてもエラーは消えませんでした。

×PIVOTの中に対象の行を２つ記載

[code]

    SELECT *
    FROM SALES
    PIVOT (
      SUM(売上金額),SUM(販売数) FOR 売上年 IN ([2013年], [2014年], [2015年])
    )
    
[/code]

×PIVOTを２つ記載

[code]

    SELECT *
    FROM SALES
    PIVOT (
      SUM(売上金額) FOR 売上年 IN ([2013年], [2014年], [2015年])
    )
    PIVOT (
      SUM(販売数) FOR 売上年 IN ([2013年], [2014年], [2015年])
    )
    
[/code]

現在はPIVOTを使わずにCASE式とGROUP BY句で実装しています。


CC BY-SA 3.0
2015-08-28T05:16:24.853
14935
2015-08-28T08:38:38.890
2015-08-28T08:38:38.890
11041
7462
question
sql-server
SQL Server PIVOT句を2回以上使い行列変換する方法


[FROM句](https://technet.microsoft.com/ja-
jp/library/ms177634\(v=sql.110\).aspx)の構文には

[code]

    <pivoted_table> ::=
       table_source PIVOT <pivot_clause> [ AS ] table_alias
    
    <pivot_clause> ::=
       ( aggregate_function ( value_column [ [ , ]...n ])
         FOR pivot_column
         IN ( <column_list> )
       )
    
[/code]

と定義されているので`<pivot_clause>`は１つしか書けないはずです。

サブクエリでそれぞれの結果を得て、それをINNER JOINで接続する方法はどうでしょうか？

[code]

    WITH
        売上 (店舗, [2013年_売上金額], [2014年_売上金額], [2015年_売上金額])
        AS (
            SELECT 店舗, [2013年], [2014年], [2015年]
            FROM SALES
            PIVOT (SUM(売上金額) FOR 売上年 IN ([2013年], [2014年], [2015年]))
        ),
        販売数 (店舗, [2013年_販売数], [2014年_販売数], [2015年_販売数])
        AS (
            SELECT 店舗, [2013年], [2014年], [2015年]
            FROM SALES
            PIVOT (SUM(販売数) FOR 売上年 IN ([2013年], [2014年], [2015年]))
        )
    SELECT 店舗, [2013年_売上金額], [2014年_売上金額], [2015年_売上金額], [2013年_販売数], [2014年_販売数], [2015年_販売数]
    FROM 売上 INNOR JOIN 販売数 ON 売上.店舗 = 販売数.店舗;
    
[/code]


CC BY-SA 3.0
2015-08-28T05:55:25.123
14938
2015-08-28T06:16:29.333
2015-08-28T06:16:29.333
4236
4236
14935
answer