データ分析やレポート作成をしていると、縦持ちのデータを横持ちに変換したいと思うこと、よくありますよね。
Excelのピボットテーブルを使えば簡単にできますが、SQL Serverにも「PIVOT句」という便利な機能があるのをご存じですか?
今回は、SQL ServerのPIVOT句を使って、縦持ちデータを横持ちに変換する方法をわかりやすく解説します!
■ 縦持ちデータとは?
まずは、以下のような「縦持ち」のデータを例にします。
中学校の生徒ごとのテストの成績を、科目ごとに記録したものです。
テーブルの作成
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 ) ;このように、1行に1科目の成績が記録されているのが「縦持ち」です。
サンプルデータの確認
サンプルデータを以下のSQLで確認します。これが典型的な縦持ちのデータです。
SELECT * FROM grades
このデータでpivotを使って生徒ごとに各教科の点数がわかるようにします。
■ PIVOT句で横持ちに変換!
このデータを「生徒ごとに各教科の点数を横並びで表示」したい場合、PIVOT句を使えば簡単です。
PIVOTの基本構文
SELECT
グループ化する列,
ピボット後の列1, ピボット後の列2, ...
FROM
元のテーブル
PIVOT (
集計関数(集計対象列)
FOR ピボット対象列 IN (列名1, 列名2, ...)
) AS 別名
実際のSQL例
SELECT
pv.name as 生徒
,pv.英語
,pv.国語
,pv.数学
,pv.理科
,pv.社会
FROM
grades
PIVOT
(
sum(score)
FOR
subject
IN ( 英語,国語,数学,理科,社会)
) AS pv
order by name実行結果(横持ち)

実行結果が横持ちになります。
■ PIVOT句のポイント
- SELECT句にはピボット後の列名を明示的に記述する必要があります。
- ピボット対象の列(今回は「subject」)の値が列名になります。
- PIVOT句には必ず別名(AS)を付ける必要があります。
まとめ
SQL ServerのPIVOT句を使えば、Excelに頼らずにSQLだけでデータの形を変換できます。
特にレポート作成やBIツールへの連携時に便利です!
「縦持ち→横持ち」の変換が必要な場面では、ぜひPIVOT句を活用してみてください!


コメント