質問: 通常PIVOTは1つの列を行に変換できますが、 複数の行を対象に変換することはできるのでしょうか。 対象:SQL Server 2012 ``` 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 ``` 以下のSQLで1行のみ売上を行列変換可能です。 ``` SELECT * FROM SALES PIVOT ( SUM(売上金額) FOR 売上年 IN ([2013年], [2014年], [2015年]) ) ``` 売上金額と販売数の両方を行列変換する場合はどうすればよいのでしょうか。 ``` 店舗 | 2013年_売上金額 | 2014年_売上金額 | 2015年_売上金額 | 2013年_販売数 | 2014年_販売数 |... A | 1000 | 2000 | 3000 | 100 | 200 | 300 |... ``` WEBの情報を参考にしましたが、以下のSQLは動きませんでした。 ASを利用して項目名が重複しないようにしてもエラーは消えませんでした。 ×PIVOTの中に対象の行を2つ記載 ``` SELECT * FROM SALES PIVOT ( SUM(売上金額),SUM(販売数) FOR 売上年 IN ([2013年], [2014年], [2015年]) ) ``` ×PIVOTを2つ記載 ``` SELECT * FROM SALES PIVOT ( SUM(売上金額) FOR 売上年 IN ([2013年], [2014年], [2015年]) ) PIVOT ( SUM(販売数) FOR 売上年 IN ([2013年], [2014年], [2015年]) ) ``` 現在はPIVOTを使わずにCASE式とGROUP BY句で実装しています。
回答: FROM句.aspx)の構文には ``` ::= table_source PIVOT [ AS ] table_alias ::= ( aggregate_function ( value_column [ [ , ]...n ]) FOR pivot_column IN ( ) ) ``` と定義されているので``は1つしか書けないはずです。 サブクエリでそれぞれの結果を得て、それをINNER JOINで接続する方法はどうでしょうか? ``` 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 売上.店舗 = 販売数.店舗; ```