2010-07-30 9 views
17

Jestem pewien, że zostało to zadane, ale nie mogę znaleźć właściwych terminów wyszukiwania.Zgrupowane agregowanie ciągów znaków/LISTAGG dla serwera SQL Server

Biorąc schemat tak:

| CarMakeID | CarMake 
------------------------ 
|   1 | SuperCars 
|   2 | MehCars 

| CarMakeID | CarModelID | CarModel 
----------------------------------------- 
|   1 |   1 | Zoom 
|   2 |   1 | Wow 
|   3 |   1 | Awesome 
|   4 |   2 | Mediocrity 
|   5 |   2 | YoureSettling 

Chcę produkować zestawu danych takiego:

| CarMakeID | CarMake | CarModels 
--------------------------------------------- 
|   1 | SuperCars | Zoom, Wow, Awesome 
|   2 | MehCars | Mediocrity, YoureSettling 

Co mogę zrobić w miejscu „AGG” na smyczki w SQL Server w następujące zapytanie o styl?

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

Odpowiedz

11

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

Jest to ciekawy problem w Transact-SQL, dla których istnieje szereg rozwiązań i poważnej debaty. W jaki sposób uzyskujesz wynik podsumowania, w którym kolumna wyróżniająca z każdego wiersza w danej kategorii jest wymieniona w kolumnie "zbiorczej"? Prosty i intuicyjny sposób wyświetlania danych jest zaskakująco trudny do osiągnięcia. Anith Sen przedstawia podsumowanie różnych sposobów i oferuje słowa ostrożnie przez nich wybrać ...

+1

Wow nietrywialne. –

+2

Artykuł wymaga aktualizacji - CLR był dla SQL Server 2005. 2008 obsługuje wiele parametrów w funkcji agregującej, dzięki czemu można odtworzyć parametry GROUP_CONCAT MySQL. –

+0

@OMG Kucyki: czy możesz wyjaśnić więcej lub link proszę? Nie jestem całkiem pewien, co masz na myśli ... – gbn

4

Jeśli jest SQL Server 2017 lub SQL Server VNext, bazy danych SQL Azure można użyć String_agg jak poniżej:

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 

wyjściowa:

+-----------+-----------+---------------------------+ 
| CarMakeId | CarMake |   CarModels   | 
+-----------+-----------+---------------------------+ 
|   1 | SuperCars | Zoom, Wow, Awesome  | 
|   2 | MehCars | Mediocrity, YoureSettling | 
+-----------+-----------+---------------------------+