LoginSignup
2
1

More than 1 year has passed since last update.

【SQL】PIVOT句の基本的な使い方

Posted at

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関数を外すとエラーになります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1