SQLServerのPIVOTを使って縦横(行列)変換を行う方法

2018-05-10SQLServer

SQLServerではPIVOTを利用することで、簡単に縦横(行列)変換することができます。

SQL ServerのPIVOT句

PIVOT関係演算子は、テーブル値式の中のある列から一意の値を取得して出力側の複数の列に変換することで式を行列変換し、最終的な出力のそれ以外の列値に必要な集計を行います。

準備として1行「名前」と「科目」、「その得点」を持ったテーブルを用意し、そのデータを人ごとに各科目の得点を1行として出力します。

PIVOT句の使用例

実際のSQLは以下の通りです。


--テーブルの準備
CREATE TABLE 成績
(
     名前   varchar(50)
    ,科目   varchar(20)
    ,得点   int
);
 
--データの準備
INSERT INTO 成績 VALUES ('システムトラスト3号', '英語',  20 ) ;
INSERT INTO 成績 VALUES ('システムトラスト3号', '国語',  30 ) ;
INSERT INTO 成績 VALUES ('システムトラスト3号', '数学',  40 ) ;
INSERT INTO 成績 VALUES ('システムトラスト3号', '理科',  50 ) ;
INSERT INTO 成績 VALUES ('システムトラスト3号', '社会',  60 ) ;
INSERT INTO 成績 VALUES ('システムトラスト1号', '英語', 100 ) ;
INSERT INTO 成績 VALUES ('システムトラスト1号', '国語',  90 ) ;
INSERT INTO 成績 VALUES ('システムトラスト1号', '数学',  80 ) ;
INSERT INTO 成績 VALUES ('システムトラスト1号', '理科',  70 ) ;
INSERT INTO 成績 VALUES ('システムトラスト1号', '社会',  60 ) ;
INSERT INTO 成績 VALUES ('システムトラスト2号', '英語',  50 ) ;
INSERT INTO 成績 VALUES ('システムトラスト2号', '国語',  40 ) ;
INSERT INTO 成績 VALUES ('システムトラスト2号', '数学',  30 ) ;
INSERT INTO 成績 VALUES ('システムトラスト2号', '理科',  20 ) ;
INSERT INTO 成績 VALUES ('システムトラスト2号', '社会',  10 ) ;
 
--PIVOT句を使って縦に並ぶデータを縦横変換を行う
SELECT
     名前
    ,英語
    ,国語
    ,数学
    ,理科
    ,社会
FROM
    成績
PIVOT ( SUM( 得点 ) FOR 科目 IN ( 英語, 国語, 数学, 理科, 社会)) AS ピボットテーブル
ORDER BY 名前;

--テーブルを削除
DROP TABLE 成績

上記のSQLを実行した実行結果は以下のようになります。

名前 英語 国語 数学 理科 社会
システムトラスト1号 100 90 80 70 60
システムトラスト2号 50 40 30 20 10
システムトラスト3号 20 30 40 50 60

難しくはないですね。

まとめ

注意が必要なのはPIVOTに指定する集計カラム(今回の場合は「得点」)は集約することが必要です。
(SUM関数を外すとエラーになります。)

以上、SQL ServerのPIVOT句を使って縦横(行列)変換を行う方法でした。

 

株式会社システムトラスト

人材募集中です。

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ