2013-04-05 20 views
8

Sto provando a raggruppare i valori delle colonne in base a una colonna specifica utilizzando FOR XML PATH('') in TSQL. Questo è il risultato in entrambi i casi (si noti che il senza XML code - vale a dire: SELECT * FROM @xml - è lo stesso che il con il codice XML):TSQL: PER PERCORSO XML ('') Impossibile raggruppare

Class   |  Animals 
================================= 
Asteroidea  |  Starfish 
Mammalia  |  Dog 
Mammalia  |  Cat 
Mammalia  |  Coyote 
Reptilia  |  Crocodile 
Reptilia  |  Lizard 

Secondo this article e this article (si noti che il secondo articolo lascia fuori la GROUP BY, che io sono sicuro come l'autore è riuscito a tirare fuori questo senza di essa - ho provato e genera solo tutti i valori), la sintassi dovrebbe essere come illustrato di seguito questo:

DECLARE @xml TABLE(
    Animal VARCHAR(50), 
    Class VARCHAR(50) 
) 

INSERT INTO @xml 
VALUES ('Dog','Mammalia') 
    , ('Cat','Mammalia') 
    , ('Coyote','Mammalia') 
    , ('Starfish','Asteroidea') 
    , ('Crocodile','Reptilia') 
    , ('Lizard','Reptilia') 

SELECT x1.Class 
    , STUFF((SELECT ',' + x2.Animal AS [text()] 
    FROM @xml x2 
    WHERE x1.Animal = x2.Animal 
    ORDER BY x2.Animal 
    FOR XML PATH('')),1,1,'') AS "Animals" 
FROM @xml x1 
GROUP BY Class 

Dopo pochi ore, tra questi esempi e il codice precedente, non riesco a vedere dove ho sbagliato sulla sintassi, ma sto ricevendo l'er ror "Column '@ xml.Animal" non è valido nell'elenco di selezione perché non è contenuto in una funzione di aggregazione o nella clausola GROUP BY. " Si noti che se si omette la clausola GROUP BY, continua a non produrre i valori nel modo appropriato. Un altro set di occhi sarebbe utile.

risposta

9

Penso che tu abbia il tuo clausola WHERE utilizzando la colonna sbagliata, che si desidera utilizzare Class non Animal:

SELECT x1.Class 
    , STUFF((SELECT ',' + x2.Animal AS [text()] 
    FROM @xml x2 
    WHERE x1.Class = x2.Class 
    ORDER BY x2.Animal 
    FOR XML PATH('')),1,1,'') AS "Animals" 
FROM @xml x1 
GROUP BY Class 

Vedi SQL Fiddle with Demo. Il risultato è:

|  CLASS |   ANIMALS | 
--------------------------------- 
| Asteroidea |   Starfish | 
| Mammalia | Cat,Coyote,Dog | 
| Reptilia | Crocodile,Lizard |