CÓMO CONVERTIR VARIAS FILAS EN UNA SOLA FILA SEPARADA POR COMA
EJEMPLO:
En el siguiente ejemplo se muestra cómo conseguir que los valores de varias filas
pasen a una sola celda separándolas por un símbolo (coma) agrupando por Client y PurchaseDate
SELECT
Client
,TotalPrice =Sum(Price)
,PurchaseDate
,ProductKey = (
select ProductKey + ', '
from @T as i
where i.Client = A.Client AND i.PurchaseDate = a.PurchaseDate for xml path('')
)
FROM @T AS A
group by Client, PurchaseDate
El query realiza la sumatoria de precio agrupandolo por Cliente y Fecha
- @T es la tabla
- para pasar a una sola fila separa por coma se utiliza el FOR XML PATH('')
- para pasar a una sola fila separa por coma se utiliza el FOR XML PATH('')
Código Completo:
DECLARE @T AS TABLE (Client varchar(20), ProductKey varchar(20), price decimal (18,2), PurchaseDate date)
INSERT INTO @T
SELECT 'Johnson' , 'CA', 85, getdate() UNION ALL
SELECT 'Johnson' , 'KI', 50, getdate() UNION ALL
SELECT 'Johnson' , 'LT', 93, getdate() UNION ALL
SELECT 'Johnson' , 'RM', 71, getdate() UNION ALL
SELECT 'Johnson' , 'RM', 71, getdate() UNION ALL
SELECT 'Johnson' , 'RM', 1, getdate() -1 UNION ALL
SELECT 'Johnson' , 'SO', 2, getdate() -1
SELECT * FROM @T
SELECT
Client
,TotalPrice =Sum(Price)
,PurchaseDate
,x = (
select ProductKey + ', '
from @T as i
where i.Client = A.Client AND i.PurchaseDate = a.PurchaseDate
for xml path('')
)
FROM @T AS A
group by Client, PurchaseDate
Result:
Concatenar filas en una sola fila con valores separados por comas con SQL
unir resultados de varias filas en una solaEJEMPLO 2
El típico ejemplo donde queremos pasar una lista de correos concatenada en una sola cadena separando por punto y coma ;
Haciendo un select asi:
select Email
from @T
for xml path ('')
Result:
<Email>correo@yahoo.com</Email>
<Email>correo@gmail.com</Email>
<Email>correo@msn.com</Email>
<Email>correo@outlook.com</Email>
<Email>correo@hotmail.com</Email>
Se genera un XML sin encabezado, bueno aqui el truco es concatenarle un caracter para separar los correos entre ';'. Con eso será suficiente para convertirlos en una cadena, una fila...
select Email + ';'
from @T
for xml path ('')
Result:
correo@yahoo.com;correo@gmail.com;correo@msn.com;correo@outlook.com;correo@hotmail.com;
CÓDIGO COMPLETO:
DECLARE @T AS TABLE (Email varchar(50))
insert into @T (Email) values
('correo@yahoo.com'),
('correo@gmail.com'),
('correo@msn.com'),
('correo@outlook.com'),
('correo@hotmail.com')
select * from @T
select
(
select Email + ';'
from @T
for xml path ('')
) AS Emails
Resultado:EN UN INNER JOIN O EN UN CROSS APPLY, DEBE METER OTRA FUNCIÓN
OUTER APPLY (
SELECT Emails = STUFF ((
SELECT Email + ''
FROM Billing.Client_Emails AS X
WHERE X.IdBrokerdesk
= A.IdBrokerdesk
AND X.IdClient
= A.IdClient_Receiver
FOR XML PATH ('')
),1,1,'')
) AS OA
No hay comentarios.:
Publicar un comentario