SQLServerのPIVOTを使って縦横(行列)変換を行う方法
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句を使って縦横(行列)変換を行う方法でした。







