2010-07-30 39 views
17

我确定这已被问到,但我无法完全找到正确的搜索关键字。针对SQL Server的分组字符串聚合/ LISTAGG

给出模式是这样的:

| 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 

我该怎么办到位“AGG”的字符串在SQL Server中的以下样式查询?

SELECT *, 
(SELECT AGG(CarModel) 
    FROM CarModels model 
    WHERE model.CarMakeID = make.CarMakeID 
    GROUP BY make.CarMakeID) as CarMakes 
FROM CarMakes make 

回答

11

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

它是在处理SQL一个有趣的问题,其中有一些解决方案和很大的争议。您如何制作一个汇总结果,其中每个特定类别的每行中的区分列都列在“汇总”列中?显示数据的一种简单而直观的方式令人惊讶地难以实现。 Anith森给出了不同方式的概述,并通过一个你选择提供谨慎的话......

+1

哇非平凡。 – 2010-07-30 06:02:18

+2

该文章需要更新 - CLR用于SQL Server 2005. 2008支持聚合函数中的多个参数,因此您可以重新创建MySQL的GROUP_CONCAT参数。 – 2010-07-30 06:22:22

+0

@OMG小马:你能解释一下吗?不太清楚你的意思... – gbn 2011-09-22 10:38:56

4

如果是SQL服务器2017年或SQL Server VNext,您可以使用String_agg如下Azure的SQL数据库:

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 | 
+-----------+-----------+---------------------------+