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 子句中的另一列排序

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)

SQL Server聚合函数与聚合开窗函数

SQL server PARTITION BY 是啥意思

sql server——分组查询(方法和思想)