No Category

Come ridurre più righe in una singola riga e colonna con SQL ServerHow to reduce multiple rows in a single row and column with SQL Server

In questo esempio si desidera eseguire il rollup di righe diverse di una tabella in una singola colonna, con ogni valore di riga separato da una virgola.

Ho un tavolo semplice come questo:

tabella_esempio1
Un fantastico tavolo continente / nazione 🙂

e voglio ottenere una tabella con una sola riga per ogni continente, con una colonna che elenca tutto lo stato del continente. Questo è il risultato che voglio ottenere:

tabella_esempio2
Il risultato che voglio ottenere

Concatena prima tutto lo stato in una stringa con il comando FOR XML:

SELECT sa. Des_Nazione [Nazioni]
FROM AreaStato come sa
ORDER PER Des_Continente,Des_D_Des_
PER PERCORSO XML('')FOR XML PATH('')

risultato_esempio1
Quindi aggiungi una virgola tra ogni stato:

Selezionare ', ' sa. Des_Nazione
FROM AreaStato come sa
ORDER PER Des_Continente,Des_D_Des_
PER PERCORSO XML('')FOR XML PATH('')

risultato_esempio2

Con il comando STUFF possiamo sostituire la prima virgola nella stringa con un char vuoto:

Selezionare STUFF((SELECT ', ' sa. Des_Nazione
FROM AreaStato come sa
ORDER PER Des_Continente,Des_D_Des_
PER PERCORSO XML('')), 1, 2, '')

risultato_esempio3

Ora semplicemente self-join tavolo e gruppo per continente:
Selezionare
Ss. Des_Continente come Continente,
STUFF((SELECT ', ' sa. Des_Nazione
FROM AreaStato come sa
DOVE sa. Des_Continente - ss. Des_Continente
ORDER PER Des_Continente,Des_D_Des_
PER PERCORSO XML('')), 1, 2, '') [Nazioni]
FROM AreaStato come ss
GRUPPO PER Des_Continente
ORDINA PER 1

…. per ottenere il risultato mostrato sopra.

Ci sono diversi modi per ottenere questo risultato, ma penso che questo sia più semplice e veloce. La query viene testata con SQL Server 2005.

Leave a Reply