取查询的最后一列,并将结果以逗号分隔在 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 列中的主要内容,如果未能解决你的问题,请参考以下文章

SQL 将 2 个表合并在一列中,以逗号分隔

MSSQL查询回显列之间用逗号分隔开怎么操作?

MS-Access查询以在另一列中收集逗号分隔的结果

连接两列数据

在 Spark 中读取最后一列作为值数组的 CSV(并且值在括号内并用逗号分隔)

mssql,逗号分隔的字符串转换成一列数据