Converti più righe in una con la virgola come separatore

Se SELECT username FROM Users ottengo questo risultato:

 nome utente
 --------
 Paolo
 John
 Maria

ma quello di cui ho veramente bisogno è una riga con tutti i valori separati da una virgola, in questo modo:

 Paolo, Giovanni, Maria

Come faccio a fare questo?

Questo dovrebbe funzionare per te. Testato fino a SQL 2000.

 create table #user (username varchar(25)) insert into #user (username) values ('Paul') insert into #user (username) values ('John') insert into #user (username) values ('Mary') declare @tmp varchar(250) SET @tmp = '' select @tmp = @tmp + username + ', ' from #user select SUBSTRING(@tmp, 0, LEN(@tmp)) 
  select distinct stuff(( select ',' + u.username from users u where u.username = username order by u.username for xml path('') ),1,1,'') as userlist from users group by username 

ha avuto un errore di battitura prima, funziona sopra

buona revisione di diversi approcci:

http://blogs.msmvps.com/robfarley/2007/04/07/coalesce-is-not-the-answer-to-string-concatentation-in-t-sql/

Articolo copia –

Coalesce non è la risposta alla concatenazione di stringhe in T-SQL Ho visto molti post nel corso degli anni sull’uso della funzione COALESCE per ottenere concatenazioni di stringhe che funzionano in T-SQL. Questo è uno degli esempi qui (preso in prestito da Readifarian Marc Ridey).

 DECLARE @categories varchar(200) SET @categories = NULL SELECT @categories = COALESCE(@categories + ',','') + Name FROM Production.ProductCategory SELECT @categories 

Questa query può essere abbastanza efficace, ma è necessario prestare attenzione e l’uso di COALESCE deve essere correttamente compreso. COALESCE è la versione di ISNULL che può richiedere più di due parametri. Restituisce la prima cosa nella lista dei parametri che non è nulla. Quindi in realtà non ha nulla a che fare con la concatenazione, e la seguente parte di codice è esattamente la stessa – senza usare COALESCE:

 DECLARE @categories varchar(200) SET @categories = '' SELECT @categories = @categories + ',' + Name FROM Production.ProductCategory SELECT @categories 

Ma la natura non ordinata dei database rende questo inaffidabile. L’intero motivo per cui T-SQL non ha (ancora) una funzione concatenata è che questo è un aggregato per il quale l’ordine degli elementi è importante. Usando questo metodo di assegnazione delle variabili per la concatenazione delle stringhe, si può effettivamente scoprire che la risposta che viene restituita non ha tutti i valori in essa contenuti, in particolare se si desidera che le sottostringhe vengano inserite in un ordine particolare. Considera quanto segue, che sulla mia macchina restituisce solo “Accessori”, quando volevo che restituisse “, Biciclette, Abbigliamento, Componenti, Accessori”:

 DECLARE @categories varchar(200) SET @categories = NULL SELECT @categories = COALESCE(@categories + ',','') + Name FROM Production.ProductCategory ORDER BY LEN(Name) SELECT @categories 

Molto meglio è usare un metodo che prenda in considerazione l’ordine e che sia stato incluso in SQL2005 appositamente per la concatenazione di stringhe – FOR XML PATH (”)

 SELECT ',' + Name FROM Production.ProductCategory ORDER BY LEN(Name) FOR XML PATH('') 

Nel post che ho effettuato recentemente confrontando GROUP BY e DISTINCT quando si utilizzavano le sottoquery, ho dimostrato l’uso di FOR XML PATH (”). Dai un’occhiata a questo e vedrai come funziona in una sottoquery. La funzione ‘STUFF’ è presente solo per rimuovere la virgola principale.

 USE tempdb; GO CREATE TABLE t1 (id INT, NAME VARCHAR(MAX)); INSERT t1 values (1,'Jamie'); INSERT t1 values (1,'Joe'); INSERT t1 values (1,'John'); INSERT t1 values (2,'Sai'); INSERT t1 values (2,'Sam'); GO select id, stuff(( select ',' + t.[name] from t1 t where t.id = t1.id order by t.[name] for xml path('') ),1,1,'') as name_csv from t1 group by id ; 

FOR XML PATH è una delle uniche situazioni in cui è ansible utilizzare ORDER BY in una sottoquery. L’altro è TOP. E quando si utilizza una colonna senza nome e FOR XML PATH (”), si otterrà una concatenazione diretta, senza tag XML. Ciò significa che le stringhe saranno codificate in HTML, quindi se si concatenano stringhe che possono avere il carattere <, ecc., Allora si dovrebbe forse correggerlo in seguito, ma in entrambi i casi, questo è ancora il modo migliore di concatenare le stringhe in SQL Server 2005.

basandosi sulla risposta di mwigdahls. se anche tu devi raggruppare qui è come farlo sembrare

 group, csv 'group1', 'paul, john' 'group2', 'mary' --drop table #user create table #user (groupName varchar(25), username varchar(25)) insert into #user (groupname, username) values ('apostles', 'Paul') insert into #user (groupname, username) values ('apostles', 'John') insert into #user (groupname, username) values ('family','Mary') select g1.groupname , stuff(( select ', ' + g.username from #user g where g.groupName = g1.groupname order by g.username for xml path('') ),1,2,'') as name_csv from #user g1 group by g1.groupname 
 DECLARE @EmployeeList varchar(100) SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + CAST(Emp_UniqueID AS varchar(5)) FROM SalesCallsEmployees WHERE SalCal_UniqueID = 1 SELECT @EmployeeList 

fonte: http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

È ansible utilizzare questa query per eseguire l’operazione sopra descritta:

 DECLARE @test NVARCHAR(max) SELECT @test = COALESCE(@test + ',', '') + field2 FROM #test SELECT field2 = @test 

Per dettagli e spiegazione passo passo, visita il seguente link http://oops-solution.blogspot.com/2011/11/sql-server-convert-table-column-data.html

Una soluzione pulita e flessibile in MS SQL Server 2005/2008 consiste nel creare una funzione CLR Agregate.

Troverai parecchi articoli (con codice) su google .

Sembra che questo articolo ti guidi attraverso l’intero processo usando C #.

In SQLite questo è più semplice. Penso che esistano implementazioni simili per MySQL, MSSql e Orable

 CREATE TABLE Beatles (id integer, name string ); INSERT INTO Beatles VALUES (1, "Paul"); INSERT INTO Beatles VALUES (2, "John"); INSERT INTO Beatles VALUES (3, "Ringo"); INSERT INTO Beatles VALUES (4, "George"); SELECT GROUP_CONCAT(name, ',') FROM Beatles; 

puoi usare stuff () per convertire le righe come valori separati da virgola

 select EmployeeID, stuff(( SELECT ',' + FPProjectMaster.GroupName FROM FPProjectInfo AS t INNER JOIN FPProjectMaster ON t.ProjectID = FPProjectMaster.ProjectID WHERE (t.EmployeeID = FPProjectInfo.EmployeeID) And t.STatusID = 1 ORDER BY t.ProjectID for xml path('') ),1,1,'') as name_csv from FPProjectInfo group by EmployeeID; 

Grazie a @AlexKuznetsov per il riferimento per ottenere questa risposta.

Se lo stai eseguendo tramite PHP, che ne dici di questo?

 $hQuery = mysql_query("SELECT * FROM users"); while($hRow = mysql_fetch_array($hQuery)) { $hOut .= $hRow['username'] . ", "; } $hOut = substr($hOut, 0, strlen($hOut) - 1); echo $hOut;