【问题标题】:how to concat all column data of a grouped row?如何连接分组行的所有列数据?
【发布时间】:2020-11-20 08:28:42
【问题描述】:

给定下表:

+--------------------+-----------+
|       Account      |  Company  |
+--------------------+-----------+
| gloria.harding     | FB        |
| gloria.harding     | Twitter   |
| bryant.schuman     | Google    |
| jerry.maxwell      | Apple     |
| rachel.heptinstall | FB        |
| rachel.heptinstall | Twitter   |
| rachel.heptinstall | Instagram |
+--------------------+-----------+

我想按 Account 对结果进行分组,但我需要将组中每一行的 Company 列连接起来,并将它们全部显示在一个匿名列中,例如所以:

+--------------------+------------------------+
|       Account      |      'Companies'       |
+--------------------+------------------------+
| gloria.harding     | FB, Twitter            |
| bryant.schuman     | Google                 |
| jerry.maxwell      | Apple                  |
| rachel.heptinstall | FB, Twitter, Instagram |
+--------------------+------------------------+

这可以在 TSQL 上实现吗?

第一个要求可以通过对Account列进行分组来轻松实现,但我不知道如何实现后者。

【问题讨论】:

  • 您目前使用的是哪个 dbms?
  • @T.Peter SQL Server 2016
  • 我很高兴问因为我认为 string_agg() 不支持 SQL Server 2016...

标签: sql tsql sql-server-2016


【解决方案1】:

您可以使用以下 - 使用stuff()

select distinct Account,
STUFF((Select ','+Company
from tablename T1
where T1.account=T2.account
FOR XML PATH('')),1,1,'') from tablename T2

【讨论】:

  • 啊,使用 FOR XML 的旧方式,我很高兴我们现在得到了 string_agg...
  • 我一直专注于使用 GROUP 因为分组行是我的头。我忘记了不同的lmao。但这是我第一次看到函数 STUFF。谢谢!
  • @T.Peter,是的老方法,但 string_agg 在 2017 年之前不可用!
【解决方案2】:

对于使用 SQL Server 2017 及更高版本的人来说,有一个比使用 XML 更简单的解决方案。微软引入了STRING_AGG 命令,这完全符合你的要求。

SELECT DISTINCT Account, (SELECT STRING_AGG(Company, ',')
                          FROM TableName T1
                          WHERE T1.Account = T2.Account) 
FROM TableName T2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多