スポンサーリンク
SQL Serverプログラミング

【SQL Server】縦持ちデータを横持ちに!便利な「PIVOT句」の使い方

SQL SQL Server
この記事は約4分で読めます。

データ分析やレポート作成をしていると、縦持ちのデータを横持ちに変換したいと思うこと、よくありますよね。
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句を活用してみてください!

コメント

タイトルとURLをコピーしました