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

标签 sql-server tsql

我读到这个: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 张 table

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"

也就是说,Joe 和 Jon 被分配了票 1 乔被分配了票 2 Jon 和 Jason 分配到票 3

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

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

选择 l.登录 从票 t1 左连接 TicketAssignments 塔斯 上 tass.TicketID=t1.TicketID 左连接 登录 l 上 l.LoginID = tass.LoginID

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

最佳答案

正如 Nathan 解释的那样,STUFF() 实际上并没有执行任何连接,它只是删除前导逗号(这更好,恕我直言,然后必须通过计算删除尾随逗号输出字符串的长度并连接):

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

输出:

<头>
TicketID 作业
1 “乔”,“乔恩”
2 “乔”
3 “乔恩”,“杰森”

请注意,在 SQL Server 2017 及更高版本上,您可以使用 STRING_AGG(),这会变得容易一些:

SELECT t.TicketID, 
  Assignment = STRING_AGG(CONCAT('"', l.Name, '"'), ', ')
FROM dbo.Tickets AS t
INNER JOIN dbo.TicketAssignments AS ta
  ON t.TicketID = ta.TicketID
INNER JOIN dbo.Logins AS l
  ON ta.LoginID = l.LoginID
GROUP BY t.TicketID;

关于sql-server - 如何将 STUFF() 应用于逗号分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14406266/

相关文章:

sql - 每个组的第二个最大值 - SQL

java - ERROR : java. sql.SQLSyntaxErrorException:您的 SQL 语法有错误;

c# - 在 asp.net 上的 sql server 中插入空值,并提供必填字段验证器

sql-server - 如何在 Groovy 中使用 MSSQL Select

sql - 获取每个 ID 的最新状态和日期

sql-server - 如何从另一个SQL更新值

SQL 服务器计数

c# - 通过数据访问层从数据库中获取数据的聪明方法?

sql-server - 使用 sql_variant 有哪些陷阱?

SQL:从多个表中合并 Select count(*)