我读了这个:http://blog.sqlauthority.com/2012/09/14/sql-server-grouping-by-multiple-columns-to-single-column-as-a-string/

我可以将其应用于我的查询之一:

SELECT t.TicketID, STUFF(
(SELECT ',' + tt.Tag
FROM TicketTag tt
WHERE tt.TicketID = t.TicketID
FOR XML PATH('')),1,1,'') AS CSV
FROM Ticket AS t
GROUP BY t.TicketID
GO

结果如下所示:
TicketID  CSV
1         tsql, sqlserver, c++
2         hi, bye, no

现在这行得通了,因为我能够直接加入一张桌子...
现在,我想再次应用STUFF()来显示带有分配给谁的TicketID。

显示被分配票证的人的查询如下:
SELECT  l.Login
FROM Ticket t1
LEFT JOIN
    TicketAssignments tass
ON
    tass.TicketID=t1.TicketID
LEFT JOIN
    Login l
ON
    l.LoginID = tass.LoginID

但是,我缺少2个关键事项:

1)我需要像在第一个示例中一样显示TicketID(并通过ticketID进行分组)
2)我需要STUFF()登录名,以便逗号分隔

请坚持使用STUFF(),我知道有时这可能不是最好的方法,但我只是想在我的代码中使用它。

编辑

3桌
Ticket
------
TicketID
TicketAssignments
-----------------
TicketID
LoginID
Login
------
LoginID
Sample data:

Ticket
------
1
2
3


TicketAssignments
------------------
1   25
1   26
2   25
3   26
3   27

Login
-----
25 Joe
26 Jon
27 Jason

我想要的结果:
TicketID  Assignment
--------------------
    1, "Joe, Jon"
    2, "Joe"
    3, "Jon", "Jason"

那是乔和乔恩被分配了票1
乔被分配了票2
乔恩(Jon)和杰森(Jason)被分配给票3

因此,STUFF()会将每个票证号将它们放在一起。我知道这样做效率不高,我现在不要求优化...

如前所述,我必须获取票证分配的查询是:

选择l。登录
从门票t1
左联接
票务分配塔斯

tass.TicketID = t1.TicketID
左联接
登录l

l.LoginID = tass.LoginID

但是,我缺少2个关键事项:
1)我需要像在第一个示例中一样显示TicketID(并通过ticketID进行分组)
2)我需要STUFF()登录名,以便它用逗号分隔

最佳答案

SELECT t.TicketID, Assignment = STUFF(
(
  SELECT ', ' + l.Name
    FROM dbo.Login AS l
    INNER JOIN dbo.TicketAssignments AS ta
      ON l.LoginID = ta.LoginID
    WHERE ta.TicketID = t.TicketID
    FOR XML PATH(''), TYPE
).value('.[1]','nvarchar(max)'), 1, 2, '')
FROM dbo.Ticket AS t
ORDER BY t.TicketID;

Demo on SQLFiddle

07-24 17:27