/ / Ottieni i dati con una virgola separata con lo stesso UserId - sql-server, sql-server-2008

Ottieni i dati con una virgola separata con lo stesso UserId - sql-server, sql-server-2008

Ho una tabella con i seguenti campi.

  • ID = Bigint (PK)
  • USERID = bigint
  • Area = Varchar (50)

Ora ogni utente ha 3 aree nella tabella (quindi ci sono 3 voci per USERid con area diversa).

inserisci la descrizione dell'immagine qui

Ho bisogno di uscita come di seguito:

inserisci la descrizione dell'immagine qui

Ora nel rapporto voglio visualizzare USERID e tutta l'Area con una virgola separata associata al suo UserID come sopra.

Provo con il gruppo ma non ho trovato aiuto.

risposte:

4 per risposta № 1

Per MS-SQL Server 2008, è possibile utilizzare il seguente hack XML.

SELECT DISTINCT t.USERID, REPLACE((
SELECT Area AS "data()"
FROM table1 a
WHERE a.USERID = t.USERID
FOR XML path("")
), " ", ", ") AS Areas
FROM table1 t

Un po 'meglio sarebbe da usare STUFF invece di REPLACE

SELECT DISTINCT t.USERID, STUFF((
SELECT Area AS "data()"
FROM table1 a
WHERE a.USERID = t.USERID
FOR XML path("")
) , 1, 1, "") AS Areas
FROM table1 t

Se hai un sacco di funzioni in cui devi usare questo e c'è un problema di prestazioni, allora è meglio dare un'occhiata al GROUP_CONCAT stringa aggregata per SQL Server. Questa è una funzione T_SQL, puoi scaricarla da CodePlex Qui.


0 per risposta № 2

Per MySQL, puoi raggruppare i risultati con i loro USERID e quindi utilizzare GROUP_CONCAT concatenare tutto Area nel gruppo. Qualcosa come questo:

SELECT USERID, GROUP_CONCAT(Area) FROM table1 GROUP BY USERID;

Per SQL Server, si potrebbe voler dare un'occhiata a Simulazione della funzione MySQL di GROUP_CONCAT in SQL Server?


0 per risposta № 3

seleziona UserID, Area = (SELEZIONA Area + "," da # table1 A1 dove A.UserID = A1.UserID PER PERCORSO XML ("")
) da # table1 A GROUP BY A.UserID