web-dev-qa-db-ja.com

単一のテーブル内の重複する行の値を連結するSQLクエリ

次のようなemployeesのテーブルがあるとします。

Name     Sex     Role

Bob      M       Developer
Joe      M       QA

今、私はこのテーブルの重複する行に問題があります。いつか直しますが、問題ありません。私が現在必要としているのは、そのようなテーブルをクエリするものです:

Name     Sex     Role

Bob      M       Developer
Bob      M       Janitor
Joe      M       QA
Joe      M       CEO

そして、次の行を出力します:

Name     Role

Bob      Developer, Janitor
Joe      QA, CEO

「役割」が別々の列に分割されるか、複数の値を持つ単一の列になるかは、私には関係ありません。

必要に応じてSQL Server 2008を使用する。

5
yellowblood

MySQLのようなGroup_concatは、SQL Server 2016までのSQL Serverでは使用できません。vNextでは STRING_AGG ただし、同等の機能を提供します。

ただし、いくつかの手動オプションがあります。

  • パラメータとして従業員の名前/ IDを取り、連結されたロール値を表示するスカラー関数を作成し、この関数を各従業員に適用します
  • xML関数を使用する
  • すでに作成された集約 を使用します(最初のオプションと同様)

現在のケースの解決策(SOからBradの回答を受け取り、テーブル用にカスタマイズした)は次のようになります。

SELECT name, LEFT(roles , LEN(roles )-1) AS roles
FROM employee AS extern
CROSS APPLY
(
    SELECT role + ','
    FROM employee AS intern
    WHERE extern.name = intern.name
    FOR XML PATH('')
) pre_trimmed (roles)
GROUP BY name, roles;

これらの詳細は、さまざまなソースから収集されます。

7
Marian