SQL Query per ottenere risultati aggregati in separatori di virgole insieme a gruppo per colonna in SQL Server

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:

  • La stessa unità SQL tra due tabelle richiede numeri di ordine in 1 cella
  • SQL e Coldfusion hanno lasciato le tabelle di join ottenendo risultati duplicati come un elenco in una colonna

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