Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamische Pivot-Spalten, keine Aggregation

Ja, Sie können einen dynamischen Pivot durchführen. Manchmal ist es einfacher, den PIVOT Abfrage zuerst mit einer statischen Version, damit Sie sehen können, wie die Abfrage und die Ergebnisse aussehen werden. Transformieren Sie dann die Abfrage in eine dynamische Version.

Hier ist ein Beispiel für eine statische vs. dynamische Version einer Abfrage:

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

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

Wenn Sie weitere Details zu Ihrer aktuellen Tabellenstruktur und dann einige Beispieldaten angeben können. Wir sollten Ihnen dabei helfen können, die Version zu erstellen, die Sie für Ihre Situation benötigen.

Wie ich bereits sagte, ist es manchmal einfacher, mit einer statischen Version zu beginnen, bei der Sie die Spalten, die Sie zuerst transformieren müssen, fest codieren und dann zur dynamischen Version übergehen.