SQL Serverにおける縦持ちのデータを横持ちに変更する方法です。備忘として残します。
縦持ちのデータを横持ちに変更する方法
例えば以下のような縦持ちデータがあるとします。
| 社員ID | 科目 | 点数 |
| 1 | 国語 | 80 |
| 1 | 算数 | 90 |
| 2 | 国語 | 70 |
| 2 | 算数 | 85 |
これを横持ちに変更する方法は2つあります。
- CASE式 + GROUP BY
- 動的SQLで列リストを組み立てる
ではそれぞれ解説します。
CASE式 + GROUP BY
CASE式とGROUP BYを使います。
SELECT
社員ID,
MAX(CASE WHEN 科目 = '国語' THEN 点数 END) AS 国語,
MAX(CASE WHEN 科目 = '算数' THEN 点数 END) AS 算数
FROM テーブル名
GROUP BY 社員ID;
カラム数固定の場合はこれでいいかと。
動的SQLで列リストを組み立てる
動的に列を増やします。列が可変である場合は有効です。
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @cols = STRING_AGG(QUOTENAME(科目), ',')
FROM (SELECT DISTINCT 科目 FROM テーブル名) AS t;
SET @sql = N'
SELECT 社員ID, ' + @cols + N'
FROM テーブル名
PIVOT (
MAX(点数) FOR 科目 IN (' + @cols + N')
) AS pvt;';
EXEC sp_executesql @sql;
列名を業務的にどうするのかは要相談ということで。
参考

ケース(Transact-SQL) - SQL Server
CASE 関数の Transact-SQL リファレンス。 CASE では、条件の一覧が評価され、特定の結果が返されます。