取查询的最后一列,并将结果以逗号分隔在 1 列中
Posted
技术标签:
【中文标题】取查询的最后一列,并将结果以逗号分隔在 1 列中【英文标题】:Take the last column of a query and make the results comma separated in 1 column 【发布时间】:2020-06-09 09:22:17 【问题描述】:我有一个 SQL Server (2018) 查询,其中最后一列 (SP.name
) 可以有多个值,从而创建重复行。我想获取最后一列的结果并将所有结果放入 1 个字段中,以逗号分隔。
例如,如果下面查询的输出是(您会看到一个人有 Field Trip 而另一个人生日)。
John , Smith, x@Z.com,New York, NY, 11208 , Field Trip
John , Smith, x@Z.com,New York, NY, 11208 , Birthday Party
我希望它是这样的,实地考察和生日在同一列。请注意,它可以超过 2 个结果,某些查询对于最后一列最多有 5 个结果。
John , Smith, x@Z.com,New York, NY, 11208 , "Field Trip,Birthday Party"
这是查询
SELECT DISTINCT
CC.FirstName, CC.LastName, CC.Email, Addresses.City, Addresses.State, Addresses.Postal, SP.Name
FROM CustContacts AS CC WITH (NoLock)
INNER JOIN Orders AS O WITH (Nolock) ON CC.CustContactID = O.ContactID
INNER JOIN Customers AS C WITH (Nolock) ON O.CustomerID = C.CustomerID
INNER JOIN SalesPrograms AS SP WITH (NoLock) ON O.SalesProgramID = SP.SalesProgramID
INNER JOIN OrderLines AS OL WITH (NoLock) ON O.OrderID = OL.OrderID
INNER JOIN RMEvents AS RME WITH (NoLock) ON OL.EventID = RME.EventID
INNER JOIN Addresses ON CC.AddressID = Addresses.AddressID
LEFT OUTER JOIN OEGroupVisits AS GV WITH (NoLock) ON O.GroupVisitID = GV.GroupVisitID
【问题讨论】:
没有 SQL Server 2018 版本 - 我们有 2012、2014、2016、2017 和 2019 - 任君选择 【参考方案1】:您似乎不需要所有这些连接。尽管它们可能用于过滤,但它们似乎并没有做太多。
由于 SQL Server 2016 不支持STRING_AGG()
,您可以使用FOR XML
技巧:
SELECT CC.FirstName, CC.LastName, CC.Email, a.City, a.State, a.Postal,
STUFF( (SELECT CONCAT(', ', SP.Name)
FROM Orders O JOIN
SalesPrograms SP
ON O.SalesProgramID = SP.SalesProgramID
WHERE CC.CustContactID = O.ContactID
FOR XML PATH ('')
), 1, 2, '') as names
FROM CustContacts CC JOIN
Addresses a
ON CC.AddressID = a.AddressID ;
【讨论】:
嗨,戈登,感谢您的出色工作! .至于连接,我的选择查询有属于这些表的其他项目,但我想保持选择语句尽可能简单。非常感谢【参考方案2】:您需要对以下表格进行自联接:CustContacts、Addresses 和 SalesPrograms 在部分或全部这些列上:CC.FirstName、CC.LastName、CC.Email、Addresses.City、Addresses.State、Addresses.Postal , SP.名称。 接下来,您需要连接这 3 个值:SP.Name、'、'、SP1.Name。这是假设您的自我加入中有 SalesPrograms AS SP 和 SalesPrograms AS SP1。
【讨论】:
以上是关于取查询的最后一列,并将结果以逗号分隔在 1 列中的主要内容,如果未能解决你的问题,请参考以下文章