有没有办法将列的值聚合和/或连接为 Group By 查询中的逗号分隔项?

Posted

技术标签:

【中文标题】有没有办法将列的值聚合和/或连接为 Group By 查询中的逗号分隔项?【英文标题】:Is there any way to aggregate and/or concatenate the values of a column as comma separated items in a Group By query? 【发布时间】:2013-07-21 17:06:09 【问题描述】:

这是我使用多层SELECT 查询检索到的数据:

TID StartID EndID   StartTime               EndTime                 ResName
1   1491005 1491020 2013-07-15 06:43:50.000 2013-07-15 06:44:38.000 NULL
1   1501403 1502819 2013-07-15 12:52:41.000 2013-07-15 13:40:10.000 TT Bill
1   1490838 1508632 2013-07-15 06:35:25.000 2013-07-15 16:57:10.000 TA Brady-MGR
1   1491039 1491267 2013-07-15 06:45:32.000 2013-07-15 06:56:35.000 TA Larry-Drv
2   1508739 1508939 2013-07-15 07:33:32.000 2013-07-15 07:44:35.000 TN John

我需要通过 TIDGROUP 这个数据,以便所有具有相同 TIDResName 值都显示为逗号分隔值。

例如: 对于 TID 1,最后一列 TIDNames 的值必须是 TT Bill,TA Brady, TA Larry

我正在为 GROUPING

使用以下查询
    Select G.TID,
    Min(G.StartId) As MinSID, Max(G.EndId) As MaxSID, 
    Min(G.StartTime) As MinStartTime, Max(G.EndTime) As MaxStartTime,
    'I need comma separated ResName values for my TID here' As TIDNames
    From ( 
           nested select - this is where I get the above data which needs further grouping
    ) G
    Group By G.TID;

我试图在这个小提琴中模拟这种场景(而不是嵌套选择,我将数据存储在一个表中):http://sqlfiddle.com/#!3/f3267/1

【问题讨论】:

【参考方案1】:

您可以使用 FOR XML PATH 将值连接成一行:

Select t1.TID,
  Min(t1.StartId) As MinSID, 
  Max(t1.EndId) As MaxSID, 
  Min(t1.StartTime) As MinStartTime, 
  Max(t1.EndTime) As MaxStartTime,
  STUFF((SELECT ', ' + t2.ResName
          FROM Item t2
          where t1.TID = t2.TID
          FOR XML PATH (''))
          , 1, 1, '')  AS TIDNames
From Item t1
Group By t1.TID;

见SQL Fiddle with Demo。

如果您查询的数据来自另一个查询,那么您可以使用 CTE:

;with cte as
(
  select * from yourqueryHere
) 
select t1.TID,
  Min(t1.StartId) As MinSID, 
  Max(t1.EndId) As MaxSID, 
  Min(t1.StartTime) As MinStartTime, 
  Max(t1.EndTime) As MaxStartTime,
  STUFF((SELECT ', ' + t2.ResName
          FROM cte t2
          where t1.TID = t2.TID
          FOR XML PATH (''))
          , 1, 1, '')  AS TIDNames
From cte t1
Group By t1.TID;

见SQL Fiddle with Demo

【讨论】:

item table 只是一个 sub select 的模拟。有什么办法处理吗?我没有将这些数据存储在实际表中。 我想我可以使用 CTE。让我试试。 是的,完全正确。感谢您的帮助和时间。 +1 和正确的解决方案。 @Learner 是的,这是一个错字。

以上是关于有没有办法将列的值聚合和/或连接为 Group By 查询中的逗号分隔项?的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 将列列表转换为聚合函数

在 group by 中,有没有办法告诉 SQL 特定列不需要聚合函数?

将列值转换为行值

在Pandas中更改列的数据类型方法总结

根据循环内另一列的值将列的值更改为nan

列的原因在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中[重复]