2010-07-30 3 views
17

Sono sicuro che è stato chiesto ma non riesco a trovare i termini di ricerca corretti.aggregazione stringa raggruppata/LISTAGG per SQL Server

Dato uno schema come questo:

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

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

voglio produrre un set di dati come questo:

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

Cosa faccio al posto di 'AGG' per le stringhe in SQL Server nel seguendo la query di stile?

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

risposta

11

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

È un problema interessante in Transact SQL, per i quali ci sono una serie di soluzioni e considerevole dibattito. Come si procede alla produzione di un risultato di riepilogo in cui una colonna distintiva di ogni riga in ogni particolare categoria è elencata in una colonna "aggregata"? Un modo semplice e intuitivo di visualizzare i dati è sorprendentemente difficile da ottenere. Anith Sen fornisce una sintesi di modi diversi, e offre parole di cautela su quello che si sceglie ...

+1

Wow non banale. –

+2

L'articolo richiede un aggiornamento: CLR era per SQL Server 2005. 2008 supporta più parametri in una funzione di aggregazione, quindi è possibile ricreare i parametri di GROUP_CONCAT di MySQL. –

+0

@OMG Ponies: puoi spiegarci di più o link per favore? Non sei abbastanza sicuro di cosa intendi ... – gbn

4

Se si tratta di SQL Server 2017 o SQL Server vNext, database di SQL Azure è possibile utilizzare String_agg come di seguito:

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 

uscita:

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