SQL Serverで抽出したデータが縦持ちのデータなので横持ちにしたいと思うことはよくあります。
こういうときは、大体Excelのピボットなどを使って変換することが多いと思います。
実はSQL Serverにもpivot句という構文があってこれを使うと簡単に縦持ちのデータを横持ちにすることができます。これを知っていると非常にデータを加工するうえで幅が広がります。
今回はpivot句で縦持ちデータ→横持ちデータに変換する方法について紹介したいと思います。
縦持ちデータのサンプル
まずは縦持ちデータのサンプルを作ります。今回は中学校の各教科のテストの成績についてまとめたデータのサンプルを作ります。
テーブルの作成
SQL Serverの任意のデータベースに以下のテーブルを作成します。
(生徒名/科目/得点)
CREATE TABLE grades
(
name varchar(50)
,subject varchar(20)
,score int
);
テストデータ作成
テストデータを作成します。
INSERT INTO grades VALUES ('生徒A', '英語', 70 ) ;
INSERT INTO grades VALUES ('生徒A', '国語', 60 ) ;
INSERT INTO grades VALUES ('生徒A', '数学', 55 ) ;
INSERT INTO grades VALUES ('生徒A', '理科', 60 ) ;
INSERT INTO grades VALUES ('生徒A', '社会', 90 ) ;
INSERT INTO grades VALUES ('生徒B', '英語', 90 ) ;
INSERT INTO grades VALUES ('生徒B', '国語', 85 ) ;
INSERT INTO grades VALUES ('生徒B', '数学', 80 ) ;
INSERT INTO grades VALUES ('生徒B', '理科', 90 ) ;
INSERT INTO grades VALUES ('生徒B', '社会', 50 ) ;
INSERT INTO grades VALUES ('生徒C', '英語', 60 ) ;
INSERT INTO grades VALUES ('生徒C', '国語', 65 ) ;
INSERT INTO grades VALUES ('生徒C', '数学', 70 ) ;
INSERT INTO grades VALUES ('生徒C', '理科', 75 ) ;
INSERT INTO grades VALUES ('生徒C', '社会', 80 ) ;
サンプルデータの確認
サンプルデータを以下のSQLで確認します。これが典型的な縦持ちのデータです。
SELECT * FROM grades
このデータでpivotを使って生徒ごとに各教科の点数がわかるようにします。
pivot句の使い方
SQL Serverのpivot句の基本構文は以下のようになります。
SELECT
グループ化対象列の値1,
グループ化対象列の値2,
...
FROM
テーブル名
PIVOT
(
集計関数(集計対象列)
FOR
グループ化対象列
IN ( グループ化対象列の値1,グループ化対象列の値2,グループ化対象列の値3,・・・,)
) AS 別名
order by 表示順序
上述のサンプルデータから横持ちデータを作成してみます。
SELECT
pv.name as 生徒
,pv.英語
,pv.国語
,pv.数学
,pv.理科
,pv.社会
FROM
grades
PIVOT
(
sum(score)
FOR
subject
IN ( 英語,国語,数学,理科,社会)
) AS pv
order by name
実行結果
実行結果が横持ちになります。
ポイント
- SELECTの後はピボットしたデータの列名を記述
- 教科(subject)のデータの値ごとに列名を集約している。
- ピボットしたデータにはASで別名を付与する。
まとめ
- 縦持ちのデータを横持ちにするときはpivotを使う。
コメント