Devo scrivere una query sql sulla tabella in modo tale che il risultato abbia il gruppo per colonna insieme alla colonna aggregata con i separatori di virgola.
Il mio tavolo sarebbe nel formato seguente
|`````````|````````| | ID | Value | |_________|________| | 1 | a | |_________|________| | 1 | b | |_________|________| | 2 | c | |_________|________|
Il risultato atteso dovrebbe essere nel formato seguente
|`````````|````````| | ID | Value | |_________|________| | 1 | a,b | |_________|________| | 2 | c | |_________|________|
Si desidera utilizzare il costrutto FOR XML PATH
:
select ID, stuff((select ', ' + Value from YourTable t2 where t1.ID = t2.ID for xml path('')), 1,2,'') [Values] from YourTable t1 group by ID
La funzione STUFF
è di eliminare l’iniziale ', '
.
Puoi anche vedere un altro esempio qui:
Solo per una visione equilibrata, puoi farlo anche con un CTE ma non è buono come il metodo cross apply non credo. Ho codificato questo dello zoccolo, quindi mi scuso se non funziona.
WITH CommaDelimitedCTE (RowNumber,ID,[Value],[Values]) AS ( SELECT 1,MT.ID , MIN(MT.Value), CAST(MIN(MT.Value) AS VARCHAR(8000)) FROM MyTable MT GROUP BY MT.ID UNION ALL SELECT CT.RowNumber + 1, MT.ID, MT.Value, CT.[Values] + ', ' + MT.Value FROM MyTable MT INNER JOIN CommaDelimitedCTE CT ON CT.ID = MT.ID WHERE MT.[Value] > CT.[Value] ) Select CommaDelimitedCTE.* from CommaDelimitedCTE INNER JOIN (SELECT MT.ID,MAX(RowNumber) as MaxRowNumber from CommaDelimitedCTE GROUP BY MT.ID) Q on Q.MT.ID = CommaDelimitedCTE.MT.ID AND Q.MaxRowNumber = CommaDelimitedCTE.RowNumber