Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Colunas dinâmicas dinâmicas, sem agregação


Sim, você pode executar um pivô dinâmico. Às vezes é mais fácil trabalhar no PIVOT query usando uma versão estática primeiro para que você possa ver como a consulta e os resultados serão exibidos. Em seguida, transforme a consulta em uma versão dinâmica.

Aqui está um exemplo de uma versão estática versus dinâmica de uma 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)

Se você puder fornecer mais detalhes sobre sua estrutura de tabela atual e alguns dados de exemplo. Devemos ser capazes de ajudá-lo a criar a versão que você precisa para sua situação.

Como eu disse, às vezes é mais fácil começar com uma versão estática, onde você codifica as colunas que você precisa transformar primeiro e depois passa para a versão dinâmica.