カンマ区切り結合:STRING_AGG関数 vs サブクエリ vs GROUP BY vs 結合
SQL Serverでサブクエリを使って複数の結果をカンマ区切りで結合する方法
この解説では、SQL Serverでサブクエリを使って複数の結果をカンマ区切りで結合する方法について、分かりやすく説明します。
ターゲット読者
- SQL Serverの基本的な操作を理解している方
- サブクエリを使ったデータの結合方法を学びたい方
前提条件
- SQL Server環境
- サンプルデータベース
使用する機能
- サブクエリ
FOR XML PATH('')
STUFF()
手順
-
サブクエリで結合する列を選択
SELECT FirstName, LastName
FROM Employees
-
カンマ区切り文字を追加
SELECT FirstName, LastName
FROM Employees
FOR XML PATH('')
-
不要な文字列を削除
SELECT STUFF((
SELECT FirstName, LastName
FROM Employees
FOR XML PATH('')
), 1, 1, '') AS FullName
-
結果を確認
SELECT FullName
FROM Employees
-- サンプルデータベース
USE AdventureWorks2019
-- サブクエリで結合する列を選択
SELECT FirstName, LastName
FROM Employees
-- カンマ区切り文字を追加
SELECT FirstName, LastName
FROM Employees
FOR XML PATH('')
-- 不要な文字列を削除
SELECT STUFF((
SELECT FirstName, LastName
FROM Employees
FOR XML PATH('')
), 1, 1, '') AS FullName
-- 結果を確認
SELECT FullName
FROM Employees
- 上記の例では、
FirstName
とLastName
列をカンマ区切りで結合しましたが、他の列も同様に結合できます。 FOR XML PATH('')
は、XML形式でデータを返す関数です。この例では、カンマ区切り文字を生成するために使用しています。STUFF()
は、文字列の一部を置換する関数です。この例では、先頭と末尾の不要なカンマ区切り文字を削除するために使用しています。
応用
- 複数のテーブルからデータを取得して結合する
- 集計結果をカンマ区切りで結合する
SELECT FirstName, LastName
FROM Employees
SELECT FirstName, LastName
FROM Employees
FOR XML PATH('')
SELECT STUFF((
SELECT FirstName, LastName
FROM Employees
FOR XML PATH('')
), 1, 1, '') AS FullName
SELECT FullName
FROM Employees
出力例
Aaron Bertrand
Ada Lovelace
Albert Einstein
...
説明
- 他のデータベースを使用する場合は、テーブル名と列名を変更する必要があります。
他の方法
方法1: STRING_AGG関数
SQL Server 2017以降では、STRING_AGG
関数を使用して、複数の結果をカンマ区切りで結合することができます。
SELECT STRING_AGG(FirstName, ', ') AS FullName
FROM Employees
方法2: GROUP BY句
GROUP BY
句を使用して、複数の結果をグループ化し、カンマ区切りで結合することができます。
SELECT FirstName, LastName
FROM Employees
GROUP BY FirstName, LastName
ORDER BY FirstName
方法3: PIVOT関数
PIVOT
関数を使用して、複数の結果をピボットテーブル形式に変換し、カンマ区切りで結合することができます。
SELECT FirstName, LastName
FROM (
SELECT FirstName, LastName, COUNT(*) AS Count
FROM Employees
GROUP BY FirstName, LastName
) AS T
PIVOT (
MAX(Count)
FOR FirstName IN ([Aaron], [Ada], [Albert])
) AS P
方法4: 結合
複数のテーブルからデータを取得して結合し、カンマ区切りで結合することができます。
SELECT E.FirstName, E.LastName
FROM Employees AS E
INNER JOIN Departments AS D
ON E.DepartmentID = D.DepartmentID
ORDER BY E.FirstName
それぞれの方法の利点と欠点
方法 | 利点 | 欠点 |
---|---|---|
サブクエリ | 汎用性が高い | 複雑な結合を行う場合、分かりにくい |
STRING_AGG関数 | シンプル | SQL Server 2017以降でのみ使用可能 |
GROUP BY句 | シンプル | 重複データが発生する場合がある |
PIVOT関数 | 複雑なデータ構造を表現できる | 複雑なクエリになる |
結合 | 複数のテーブルからデータを取得できる | 結合条件を正しく設定する必要がある |
sql-server t-sql join