SQL Server 的分组字符串聚合/LISTAGG
Posted
技术标签:
【中文标题】SQL Server 的分组字符串聚合/LISTAGG【英文标题】:Grouped string aggregation / LISTAGG for SQL Server 【发布时间】:2011-03-23 02:06:52 【问题描述】:我确定有人问过这个问题,但我找不到合适的搜索词。
给定这样的架构:
| CarMakeID | CarMake
------------------------
| 1 | SuperCars
| 2 | MehCars
| CarMakeID | CarModelID | CarModel
-----------------------------------------
| 1 | 1 | Zoom
| 2 | 1 | Wow
| 3 | 1 | Awesome
| 4 | 2 | Mediocrity
| 5 | 2 | YoureSettling
我想生成这样的数据集:
| CarMakeID | CarMake | CarModels
---------------------------------------------
| 1 | SuperCars | Zoom, Wow, Awesome
| 2 | MehCars | Mediocrity, YoureSettling
在以下样式查询中,对于 SQL Server 中的字符串,我该如何代替“AGG”?
SELECT *,
(SELECT AGG(CarModel)
FROM CarModels model
WHERE model.CarMakeID = make.CarMakeID
GROUP BY make.CarMakeID) as CarMakes
FROM CarMakes make
【问题讨论】:
【参考方案1】:如果是 SQL Server 2017 或 SQL Server VNext,Azure SQL 数据库可以使用 String_agg 如下:
SELECT make.CarMakeId, make.CarMake,
CarModels = string_agg(model.CarModel, ', ')
FROM CarModels model
INNER JOIN CarMakes make
ON model.CarMakeId = make.CarMakeId
GROUP BY make.CarMakeId, make.CarMake
输出:
+-----------+-----------+---------------------------+
| CarMakeId | CarMake | CarModels |
+-----------+-----------+---------------------------+
| 1 | SuperCars | Zoom, Wow, Awesome |
| 2 | MehCars | Mediocrity, YoureSettling |
+-----------+-----------+---------------------------+
【讨论】:
【参考方案2】:http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
这是 Transact SQL 中的一个有趣问题,对此有许多解决方案和相当大的争论。您如何生成汇总结果,其中每个特定类别中每一行的区别列都列在“汇总”列中?一种简单、直观的数据显示方式令人惊讶地难以实现。 Anith Sen 总结了不同的方式,并对您选择的方式提出了警告......
【讨论】:
文章需要更新 - CLR 是针对 SQL Server 2005 的。2008 支持聚合函数中的多个参数,因此您可以重新创建 mysql 的 GROUP_CONCAT 参数。 @OMG Ponies:你能解释更多或链接吗?不太清楚你的意思... 2005 CLR 仅支持为 CLR 聚合函数定义一个参数的能力——这只是您要连接的列。 MySQL 的 GROUP_CONCAT 支持更多参数(即:DISTINCT、ORDER BY 等),如果有人想重新创建 MySQL 功能,只有 SQL Server 2008+ 支持。 虽然链接的文章绝对完美,但 SO 鼓励您不要发布仅链接的答案。对文章中描述的各种方法的简要描述,以及对问题中提供的示例数据的真正解决方案,将使我的反对变成赞成。以上是关于SQL Server 的分组字符串聚合/LISTAGG的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver2008,sql编程,group by 用法
按 Sql Server 中的一列分组并按未包含在聚合函数或 GROUP BY 子句中的另一列排序