ホームページ >データベース >mysql チュートリアル >SQL Server で GROUP BY を使用して複数の値をカンマ区切りの文字列に連結するにはどうすればよいですか?

SQL Server で GROUP BY を使用して複数の値をカンマ区切りの文字列に連結するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-10 17:37:45274ブラウズ

How Can I Concatenate Multiple Values into a Comma-Separated String Using GROUP BY in SQL Server?

SQL Server でのカンマ区切り文字列によるデータの集計

SQL Server の GROUP BY 句は、データの集計に優れています。 しかし、グループ化された行の複数の値を単一のカンマ区切りの文字列に結合するにはどうすればよいでしょうか?

課題:

次のようなテーブルを想像してください:

<code>ID    ReportId     Email
1     1            a@domain.com
2     2            b@domain.com
3     1            c@domain.com
4     3            d@domain.com
5     3            e@domain.com</code>

目標は、ReportId でグループ化し、レポートごとに電子メールをカンマ区切りのリストに連結することです。

解決策: サブクエリと FOR XML PATH

サブクエリと FOR XML PATH メソッドを使用してこれを実現する方法は次のとおりです。

<code class="language-sql">SELECT ReportId, Email = 
    STUFF((SELECT ', ' + Email
           FROM table_name b 
           WHERE b.ReportId = a.ReportId 
          FOR XML PATH('')), 1, 2, '')
FROM table_name a
GROUP BY ReportId;</code>

説明:

  • サブクエリ: 内部の SELECT ステートメントは、特定の ReportId に関連付けられたすべての電子メールを取得します。
  • FOR XML PATH(''): この関数は、各電子メールを個別のノードとして、電子メールの結果を XML 文字列に変換します。 '' は、親ノードが作成されないことを保証します。
  • STUFF: STUFF 関数は、SELECT ステートメントによって追加された先頭のカンマとスペースを削除し、きれいなカンマ区切りの文字列を生成します。

結果:

クエリは次の出力を生成します:

<code>ReportId     Email
1            a@domain.com, c@domain.com
2            b@domain.com
3            d@domain.com, e@domain.com</code>

これにより、複数の電子メール アドレスが各 ReportId の単一のカンマ区切り文字列に効果的に統合されます。 このアプローチはうまく機能しますが、より効率的なソリューションを得るために、STRING_AGG (SQL Server の新しいバージョンで利用可能) などの他のデータベース固有の関数を検討することを検討してください。

以上がSQL Server で GROUP BY を使用して複数の値をカンマ区切りの文字列に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。