sql >> Base de Datos >  >> RDS >> Sqlserver

Columnas dinámicas de pivote, sin agregación

Sí, puede realizar un pivote dinámico. A veces es más fácil trabajar con PIVOT consulta usando una versión estática primero para que puedas ver cómo aparecerán la consulta y los resultados. Luego transforme la consulta en una versión dinámica.

Este es un ejemplo de una versión estática frente a una dinámica de una consulta:

Estático (SQL Fiddle ):

select *
from 
(
    select u.userid,
        u.fname,
        u.lname,
        u.mobile,
        r.question,
        r.choice
    from users u
    left join results r
        on u.questionid = r.questionid
        and u.choiceid = r.choiceid
) x
pivot
(
    min(choice)
    for question in([are you], [from])
) p

Dinámico (SQL Fiddle ):

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
            FROM results c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
            (
                select u.userid,
                    u.fname,
                    u.lname,
                    u.mobile,
                    r.question,
                    r.choice
                from users u
                left join results r
                    on u.questionid = r.questionid
                    and u.choiceid = r.choiceid
           ) x
            pivot 
            (
                min(choice)
                for question in (' + @cols + ')
            ) p '


execute(@query)

Si puede proporcionar más detalles sobre la estructura de su tabla actual y luego algunos datos de muestra. Deberíamos poder ayudarlo a crear la versión que necesitaría para su situación.

Sin embargo, como dije, a veces es más fácil comenzar con una versión estática, en la que primero codifica las columnas que necesita transformar y luego pasa a la versión dinámica.