5

重複の可能性:
SQL Server: 複数の行をカンマ区切りで 1 つの列にすることはできますか?

テーブル X(X_ID, X_Name) はテーブル Y(Y_ID, Y_Value) の 1-M です

表 X:

X_ID    X_Name
----    ------
12      foo
14      foo2
16      foo3

テーブル Y:

X_ID    Y_Value
----    -------
12      A
12      B
14      C
14      D
14      E
16      F
16      G

T-Sql を使用して次の結果を取得するにはどうすればよいですか?

X_ID   X_Name   Y_Value
----   ------   ------
12     foo      A,B
14     foo2     C,D,E
16     foo3     F,G

ありがとう

4

1 に答える 1

15
SELECT X.X_ID, X.X_Name, Y_Values = STUFF((SELECT N',' + Y_Value FROM dbo.Y
  WHERE Y.X_ID = X.X_ID
  FOR XML PATH(''), 
  TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, N'')
  FROM dbo.X;

SQLServer2017およびAzureSQLDatabaseでは、次の新しいSTRING_AGG()関数を使用できます。

SELECT x.X_ID, x.X_Name, 
    Y_Values = STRING_AGG(Y.Y_Value,',')
  FROM dbo.X
  INNER JOIN dbo.Y
  ON X.X_ID = Y.X_ID
  GROUP BY x.X_ID, x.X_Name;

デフォルトの順序が気に入らない場合は、次を使用して指定できますWITHIN GROUP

SELECT x.X_ID, x.X_Name, 
    Y_Values = STRING_AGG(Y.Y_Value,',') WITHIN GROUP (ORDER BY Y.Y_Value)
  FROM dbo.X
  INNER JOIN dbo.Y
  ON X.X_ID = Y.X_ID
  GROUP BY x.X_ID, x.X_Name;
于 2012-05-21T15:14:22.250 に答える