はじめに
SQLServerで横並びを縦並びにするクエリ「UNPIVOT」と「CROSS APPLY」のサンプルを纏めておきます。
横並びから縦並びへの変換では「UNION」を使いがちですが、カラム数が多い場合は「UNPIVOT」や「CROSS APPLY」が有効です。
縦並びから横並びへの変換クエリは以下の記事に書いています。
サンプル
テーブル構成
学籍番号 | 学年 | 組 | 国語 | 数学 | 英語 | 社会 | 理科 |
---|---|---|---|---|---|---|---|
20220101 | 1 | A | 83 | 65 | 30 | 57 | 22 |
20220102 | 1 | A | 78 | 30 | 95 | 35 | 59 |
20220103 | 1 | A | 31 | 65 | 51 | 34 | 83 |
… |
UNPIVOT
SELECT [学籍番号]
, [学年]
, [組]
, [科目]
, [点数]
FROM [v_student_score]
UNPIVOT ([点数] FOR [科目] IN ([国語], [数学], [英語], [社会], [理科])) AS T
結果
学籍番号 | 学年 | 組 | 科目 | 点数 |
---|---|---|---|---|
20220101 | 1 | A | 国語 | 83 |
20220101 | 1 | A | 数学 | 65 |
20220101 | 1 | A | 英語 | 30 |
20220101 | 1 | A | 社会 | 57 |
20220101 | 1 | A | 理科 | 22 |
20220102 | 1 | A | 国語 | 78 |
20220102 | 1 | A | 数学 | 30 |
… |
CROSS APPLY
SELECT [学籍番号]
, [学年]
, [組]
, [科目]
, [点数]
FROM [v_student_score]
CROSS APPLY (VALUES ('国語', [国語])
, ('数学', [数学])
, ('英語', [英語])
, ('社会', [社会])
, ('理科', [理科])
) V(科目,点数)
ORDER BY [学年]
, [組]
, [学籍番号]
結果は「UNPIVOT」と同じです。