2017-03-18 6 views
2

への参加から複数のリターンを変換しますは、私はこのクエリを持つ単一のコンマ区切りリスト

SELECT 
    c.FirstName + ' ' + c.LastName AS Name, 
    r.Name AS Roles 
FROM 
    Contacts c 
    JOIN AspNetUsers u on c.ContactID = u.ContactID 
    JOIN AspNetUserRoles ur on u.id = ur.UserId 
    JOIN AspNetRoles r on ur.RoleId = r.Id 

セットを返すことは、このような何か:私が望む何

Name  Roles 
----------------------- 
Bob Jones Admin 
Bob Jones Agent 
Jane Smith Broker 
Jane Smith Buyer 

はこれです:

Name  Roles 
----------------------- 
Bob Jones Admin, Agent 
Jane Smith Broker, Buyer 

私はCOALESCEGroupByで遊んでてきたが、私はように見えることはできません適切な組み合わせを得る。

答えて

2

別のアプローチは、CTEであなたの元のクエリを配置し、その後、最終的な要約

;with cte as (
    SELECT 
     c.FirstName + ' ' + c.LastName AS Name, 
     r.Name AS Roles 
    FROM 
     Contacts c 
     JOIN AspNetUsers u on c.ContactID = u.ContactID 
     JOIN AspNetUserRoles ur on u.id = ur.UserId 
     JOIN AspNetRoles r on ur.RoleId = r.Id 
) 
Select A.Name 
     ,Roles = Stuff((Select Distinct ', ' +Roles From cte Where Name=A.Name For XML Path ('')),1,2,'') 
From (Select Distinct Name from cte) A 
+0

ありがとう!質問...この記事の同じものについて、私は最終結果で必要ないくつかのフィールドを削除しました。私はあなたのクエリにそれらを追加する方法を考え出すのに問題があります。連絡先テーブルからc.ContactIDとc.Emailも必要としたとします。 –

+1

@CaseyCrookstonの最後のFROM(Select Distinct ContactID、Name、Email from cte)A –

4

Googleの「SQL Server string aggregate」のように、これはXML文字列で行います。

あなたのケースでは、JOINのためにクエリが明白でない場合があります。ここでのポイントは、あなたがそれを避けることができる場合は、外側のクエリで集計を行うにはしたくないということです

SELECT c.FirstName + ' ' + c.LastName AS Name, 
     STUFF((SELECT ',' + r.Name 
       FROM AspNetUsers u JOIN 
        AspNetUserRoles ur 
        ON u.id = ur.UserId JOIN 
        AspNetRoles r 
        ON ur.RoleId = r.Id 
       WHERE c.ContactID = u.ContactID 
       FOR XML PATH (''), TYPE 
      ).VALUE('.', 'nvarchar(max)' 
        ), 1, 1, '') 
      as Roles 
FROM Contacts c; 

:私はこれが最善の方法だと思います。代わりに、これは相関サブクエリを使用します。

注:ロールのないユーザーが返されるため、正確にはに相当しません。

+0

感謝を作成することです!私はテストしています。コンマやオープンまたはクローズがないと思われます。 –

+0

@CaseyCrookston追加の閉じ括弧を削除しました。今すぐ試してください。 – SqlZim

関連する問題