【SQLServer】縦持ちのデータをpivotで横持ちにする

SQL
スポンサーリンク

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を使う。

コメント

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