Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Pivot colonne dinamiche, nessuna aggregazione

Sì, puoi eseguire un pivot dinamico. A volte è più facile elaborare il PIVOT query utilizzando prima una versione statica in modo da poter vedere come appariranno la query e i risultati. Quindi trasforma la query in una versione dinamica.

Ecco un esempio di una versione statica e dinamica di una query:

Statico (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

Dinamico (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 puoi fornire maggiori dettagli sulla struttura della tabella corrente e quindi alcuni dati di esempio. Dovremmo essere in grado di aiutarti a creare la versione di cui avresti bisogno per la tua situazione.

Come ho detto però, a volte è più facile iniziare con una versione statica, in cui si codificano prima le colonne che devono essere trasformate, quindi si passa alla versione dinamica.