如何将STUFF()应用于逗号分隔

oJM*_*86o 3 t-sql sql-server

我读到这个: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
Run Code Online (Sandbox Code Playgroud)

这导致如下所示:

TicketID  CSV
1         tsql, sqlserver, c++
2         hi, bye, no
Run Code Online (Sandbox Code Playgroud)

现在这很有效,因为我能够直接加入一个表...现在我想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
Run Code Online (Sandbox Code Playgroud)

但是,我错过了两件关键的事情:

1)我需要在第一个例子中显示TicketID(按照ticketID分组)2)我需要STUFF()登录名,以便它以逗号分隔出来

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

编辑

3桌

Ticket 
------
TicketID
Run Code Online (Sandbox Code Playgroud)
TicketAssignments
-----------------
TicketID
LoginID
Run Code Online (Sandbox Code Playgroud)
Login
------
LoginID
Run Code Online (Sandbox Code Playgroud)
Sample data:

Ticket
------
1
2
3


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

Login
-----
25 Joe
26 Jon
27 Jason
Run Code Online (Sandbox Code Playgroud)

我想要的结果:

TicketID  Assignment
--------------------
    1, "Joe, Jon"
    2, "Joe"
    3, "Jon", "Jason"
Run Code Online (Sandbox Code Playgroud)

那是Joe和Jon被分配的票1 Joe被分配票2 Jon和Jason被分配给票3

所以STUFF()只是将每个ticketid放在一行中.我知道这效率不高,我现在不要求优化......

如上所述,我必须获得票证分配的查询:

SELECT l.Login FROM Ticket t1 LEFT JOIN TicketAssignments tass ON tass.TicketID = t1.TicketID LEFT JOIN登录l ON l.LoginID = tass.LoginID

但是,我缺少两个关键的东西:1)我需要在第一个例子中显示TicketID(通过ticketID分组)2)我需要STUFF()登录名,以便它以逗号分隔出来

Aar*_*and 6

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;
Run Code Online (Sandbox Code Playgroud)

在SQLFiddle上演示