es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pivote SQL para generar columnas dinámicas.

Tengo los siguientes datos:

Tengo el siguiente código:


select * from ( SELECT d.CreatedDate, m.siteid, m.ProjectNum FROM DWCorp.SSMaster m INNER JOIN DWCorp.SSDetail d ON d.MasterId = m.Id WHERE ActionId = 7 )as Sourcetable pivot ( max(createddate) for siteid in (1,2,[3],[4],[5]) ) As pivottable

Me gustaría que los datos se vean así:

Nunca habrá más de 5 fechas. Actualmente se agrupa por sitio, lo cual no quiero. Quiero agruparlo por fecha.

¿Alguien puede ayudar? Sé que tal vez necesite usar SQL dinámico, pero no estoy seguro de cómo hacerlo. He buscado en el foro, pero no encuentro exactamente lo que busco.

Texto de salida:

CreatedDate siteid ProjectNum
2021-04-06 13:14:01.8933333 20 OTHO00006
2021-04-28 16:40:01.9066667 20 OTHO00006
2021-05-03 22:47:01.7466667 20 OTHO00006
2021-04-28 16:42:02.3700000 20 OTHO00016
2021-05-06 13:27:01.9633333 20 OTHO00016
2021-05-27 15:10:01.7066667 20 OTHO00018
2021-06-29 13:01:01.9266667 20 OTHO00024
2021-05-12 13:38:01.8300000 20 OTHO00024
2021-06-29 13:02:04.7800000 20 OTHO00028
2021-03-25 13:00:03.6100000 21 OBEL00001
2021-08-10 19:44:01.9233333 21 OBEL00003
2021-11-03 20:45:39.2733333 21 OBEL00003
2021-04-26 18:57:34.5533333 21 OBEL00004

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Puede usar SQL dinámico para pivotar los datos por fecha. La siguiente consulta le dará la salida deseada:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar(10), CreatedDate, 120)) 
                        from DWCorp.SSDetail
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT siteid, ProjectNum, ' + @cols + ' from 
                 (
                    SELECT 
                        d.CreatedDate,
                        m.siteid,
                        m.ProjectNum
                    FROM DWCorp.SSMaster m 
                    INNER JOIN DWCorp.SSDetail d ON d.MasterId = m.Id WHERE  ActionId = 7
                ) x
                pivot 
                (
                    max(createddate)
                    for CreatedDate in (' + @cols + ')
                ) p '
    
    execute(@query)
    

Comments are closed.