記事内に広告が含まれています。

【SQL Server】縦持ちのデータを横持ちに変更する

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 では、条件の一覧が評価され、特定の結果が返されます。