PIVOT句
テーブルの中にあるレコード(行)をカラム(列)に変換
基本的な構文
1 SELECT
2 グループ化対象列の値1,
3 グループ化対象列の値2,
4 ・・・
5 FROM テーブル名
6 PIVOT (
7 集計関数(集計対象列)
8 FOR グループ化対象列
9 IN (グループ化対象列の値1, グループ化対象列の値2, ・・・)
10 ) AS 別名
PIVOT句を使ってみよう
1 テーブルの作成
CREATE TABLE grades
(
name varchar(20)
,subject varchar(20)
,score int
);
2 テストデータの準備
INSERT INTO grades VALUES ('生徒A', '国語', 60 ) ;
INSERT INTO grades VALUES ('生徒A', '理科', 70 ) ;
INSERT INTO grades VALUES ('生徒A', '数学', 55 ) ;
INSERT INTO grades VALUES ('生徒A', '社会', 90 ) ;
INSERT INTO grades VALUES ('生徒B', '数学', 80 ) ;
INSERT INTO grades VALUES ('生徒B', '国語', 80 ) ;
INSERT INTO grades VALUES ('生徒B', '理科', 90 ) ;
INSERT INTO grades VALUES ('生徒B', '社会', 50 ) ;
INSERT INTO grades VALUES ('生徒C', '国語', 65 ) ;
INSERT INTO grades VALUES ('生徒C', '数学', 70 ) ;
INSERT INTO grades VALUES ('生徒C', '理科', 75 ) ;
INSERT INTO grades VALUES ('生徒C', '社会', 80 ) ;
3 pivotで生徒毎にに各教科の点数を集計
SELECT
a.name as 生徒
,a.英語
,a.国語
,a.数学
,a.理科
,a.社会
FROM
grades
PIVOT
(
sum(score)
FOR
subject
IN ( 英語,国語,数学,理科,社会)
) AS a
order by name
4 実行結果
生徒 | 国語 | 理科 | 数学 | 社会 |
---|---|---|---|---|
生徒A | 60 | 70 | 55 | 90 |
生徒B | 80 | 90 | 80 | 50 |
生徒C | 65 | 75 | 70 | 80 |
まとめ
注意点としてはPIVOTに指定する集計カラム(今回の場合は「score)は集約することが必要です。
※SUM関数を外すとエラーになります。