jueves, 1 de octubre de 2015

FILAS A UNA CELDA


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('')



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
             ,= (
                            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 sola


EJEMPLO 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




PARA EVITAR EL NOMBRE DE COLUMNA COMO ÉSTA:





No hay comentarios.:

Publicar un comentario