Агрегирование сгруппированных строк / LISTAGG для SQL Server - PullRequest
18 голосов
/ 30 июля 2010

Я уверен, что об этом спрашивали, но я не могу найти правильные условия поиска.

С учетом такой схемы:

| 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

Ответы [ 2 ]

11 голосов
/ 30 июля 2010

http://www.simple -talk.com / SQL / T-SQL-программирование / конкатенация-строка-значения-в-Transact-SQL /

Это интересная проблема в Transact SQL, для которой есть ряд решений и много споров. Как вы собираетесь получить итоговый результат, в котором отличительный столбец от каждой строки в каждой конкретной категории указан в столбце «совокупный»? Простой и интуитивно понятный способ отображения данных на удивление труднодостижим. Анит Сен дает краткое изложение различных способов и предлагает слова предостережения по поводу того, который вы выбираете ...

4 голосов
/ 09 мая 2017

Если это SQL Server 2017 или SQL Server VNext, базу данных SQL Azure можно использовать 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 |
+-----------+-----------+---------------------------+
...