代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

SQL Server的分组字符串聚合/listag

  •  18
  • Matt Mitchell  · 技术社区  · 14 年前

    我肯定有人问过这个问题,但我找不到合适的搜索词。

    | 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
    

    SELECT *, 
     (SELECT AGG(CarModel) 
      FROM CarModels model
      WHERE model.CarMakeID = make.CarMakeID
      GROUP BY make.CarMakeID) as CarMakes
    FROM CarMakes make
    
    2 回复  |  直到 14 年前
        1
  •  11
  •   gnat Nat Poor    8 年前

    http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

    在Transact-SQL中,这是一个有趣的问题,对此有许多解决方案和相当大的争论。如何生成一个摘要结果,其中每个特定类别中的每一行的一个区分列都列在“聚合”列中?一种简单直观的数据显示方式很难实现。安尼思森给出了不同的方式总结,并提供了一个你选择谨慎的话。。。

        2
  •  5
  •   Kannan Kandasamy    7 年前

    如果是SQL Server 2017或SQL Server VNext,Azure SQL数据库,则可以使用字符串\u 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 |
    +-----------+-----------+---------------------------+