tsql - texto - string_split
Convierta varias filas en una con comas como separador (10)
Esta pregunta ya tiene una respuesta aquí:
Si SELECT username FROM Users
obtengo este resultado:
username -------- Paul John Mary
pero lo que realmente necesito es una fila con todos los valores separados por coma, como este:
Paul, John, Mary
¿Cómo hago esto?
En SQLite esto es más simple. Creo que hay implementaciones similares para MySQL, MSSql y 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;
Esto debería funcionar para ti. Probado todo el camino de vuelta 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))
Puede usar esta consulta para realizar la tarea anterior:
DECLARE @test NVARCHAR(max)
SELECT @test = COALESCE(@test + '','', '''') + field2 FROM #test
SELECT field2 = @test
Para detalles y explicación paso a paso, visite el siguiente enlace http://oops-solution.blogspot.com/2011/11/sql-server-convert-table-column-data.html
Si estás ejecutando esto a través de PHP, ¿qué tal esto?
$hQuery = mysql_query("SELECT * FROM users");
while($hRow = mysql_fetch_array($hQuery)) {
$hOut .= $hRow[''username''] . ", ";
}
$hOut = substr($hOut, 0, strlen($hOut) - 1);
echo $hOut;
Una solución limpia y flexible en MS SQL Server 2005/2008 es crear una función CLR Agregate.
Encontrarás bastantes artículos (con código) en google .
Parece que este artículo lo guía a través de todo el proceso usando C #.
basándose en la respuesta de mwigdahls. Si también necesita agrupar aquí, ¿cómo lograr que se vea como
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
buena revisión de varios enfoques:
Copia del artículo
Coalesce no es la respuesta a la concatenación de cadenas en T-SQL. He visto muchas publicaciones a lo largo de los años sobre el uso de la función COALESCE para que la concatenación de cadenas funcione en T-SQL. Este es uno de los ejemplos aquí (tomado de Readifarian Marc Ridey).
DECLARE @categories varchar(200)
SET @categories = NULL
SELECT @categories = COALESCE(@categories + '','','''') + Name
FROM Production.ProductCategory
SELECT @categories
Esta consulta puede ser bastante efectiva, pero se debe tener cuidado, y se debe entender correctamente el uso de COALESCE. COALESCE es la versión de ISNULL que puede tomar más de dos parámetros. Devuelve lo primero en la lista de parámetros que no es nulo. Entonces realmente no tiene nada que ver con la concatenación, y el siguiente fragmento de código es exactamente el mismo, sin usar COALESCE:
DECLARE @categories varchar(200)
SET @categories = ''''
SELECT @categories = @categories + '','' + Name
FROM Production.ProductCategory
SELECT @categories
Pero la naturaleza desordenada de las bases de datos hace que esto no sea confiable. El motivo por el cual T-SQL no (todavía) tiene una función de concatenación es que este es un agregado para el cual el orden de los elementos es importante. Al utilizar este método de asignación de variables de la concatenación de cadenas, es posible que descubra que la respuesta que se devuelve no tiene todos los valores, especialmente si desea que las subcadenas se coloquen en un orden determinado. Considere lo siguiente, que en mi máquina solo devuelve '', Accesorios'', cuando quería que volviera '', Bicicletas, Ropa, Componentes, Accesorios'':
DECLARE @categories varchar(200)
SET @categories = NULL
SELECT @categories = COALESCE(@categories + '','','''') + Name
FROM Production.ProductCategory
ORDER BY LEN(Name)
SELECT @categories
Es mucho mejor utilizar un método que tenga en cuenta el orden, y que se haya incluido en SQL2005 específicamente para el propósito de la concatenación de cadenas: FOR XML PATH ('''')
SELECT '','' + Name
FROM Production.ProductCategory
ORDER BY LEN(Name)
FOR XML PATH('''')
En la publicación que hice recientemente comparando GROUP BY y DISTINCT al usar subconsultas, demostré el uso de FOR XML PATH (''''). Eche un vistazo a esto y verá cómo funciona en una subconsulta. La función ''STUFF'' solo está ahí para eliminar la coma inicial.
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 es una de las únicas situaciones en las que puede usar ORDER BY en una subconsulta. El otro es TOP. Y cuando use una columna sin nombre y FOR XML PATH (''''), obtendrá una concatenación directa, sin etiquetas XML. Esto significa que las cadenas estarán codificadas en HTML, así que si estás concatenando cadenas que pueden tener el carácter </ font> (</ font>), entonces quizás debas arreglarlo luego, pero de cualquier forma, esta sigue siendo la mejor forma de concatenación de cadenas. en SQL Server 2005.
puede usar cosas () para convertir filas como valores separados por comas
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;
Gracias @AlexKuznetsov por la referencia para obtener esta respuesta.
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
tenía un error tipográfico antes, el anterior funciona
DECLARE @EmployeeList varchar(100)
SELECT @EmployeeList = COALESCE(@EmployeeList + '', '', '''') +
CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1
SELECT @EmployeeList
fuente: http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string