【问题标题】:Grouped string aggregation / LISTAGG for SQL ServerSQL Server 的分组字符串聚合/LISTAGG
【发布时间】: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

【问题讨论】:

    标签: sql sql-server aggregate-functions


    【解决方案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 鼓励您不要发布仅链接的答案。对文章中描述的各种方法的简要描述,以及对问题中提供的示例数据的真正解决方案,将使我的反对变成赞成。
      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2018-10-12
      • 2011-06-14
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      相关资源
      最近更新 更多