2010-07-30 24 views
17

Ich bin mir sicher, dass dies gefragt wurde, aber ich kann nicht die richtigen Suchbegriffe finden.Gruppierte String Aggregation/LISTAGG für SQL Server

ein Schema wie folgt gegeben:

| CarMakeID | CarMake | CarModels 
--------------------------------------------- 
|   1 | SuperCars | Zoom, Wow, Awesome 
|   2 | MehCars | Mediocrity, YoureSettling 
Was kann ich tun, anstelle von 'AGG' für Zeichenfolgen in SQL Server in der:

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

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

ich einen Datensatz wie diese produzieren wollen folgende Stilabfrage?

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

Antwort

11

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

Es ist ein interessantes Problem in Transact SQL, für die es eine Reihe von Lösungen und erheblichen Diskussionen. Wie gehen Sie vor, um ein Zusammenfassungsergebnis zu erstellen, in dem eine Unterscheidungsspalte von jeder Reihe in jeder einzelnen Kategorie in einer "Aggregatspalte" aufgeführt ist? Eine einfache und intuitive Art der Datenanzeige ist überraschend schwer zu erreichen. Anith Sen gibt einen Überblick über verschiedene Möglichkeiten und bietet warnende Worte über die Sie wählen ...

+1

Wow nicht-trivial. –

+2

Der Artikel benötigt ein Update - die CLR war für SQL Server 2005. 2008 unterstützt mehrere Parameter in einer Aggregatfunktion, so dass Sie die GROUP_CONCAT-Parameter von MySQL neu erstellen können. –

+0

@OMG Ponys: Kannst du mehr erklären oder verlinken? Nicht ganz sicher, was Sie meinen ... – gbn

4

Wenn SQL Server 2017 oder SQL Server vNext, Azure SQL-Datenbank ist Sie String_agg wie unten verwenden:

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 

Output:

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