Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pivotez les colonnes dynamiques, pas d'agrégation

Oui, vous pouvez effectuer un pivot dynamique. Parfois, il est plus facile de travailler sur le PIVOT requête en utilisant d'abord une version statique afin que vous puissiez voir comment la requête et les résultats apparaîtront. Transformez ensuite la requête en une version dynamique.

Voici un exemple de version statique ou dynamique d'une requête :

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

Dynamique (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 vous pouvez fournir plus de détails sur la structure de votre table actuelle, puis quelques exemples de données. Nous devrions pouvoir vous aider à créer la version dont vous auriez besoin pour votre situation.

Comme je l'ai dit, il est parfois plus facile de commencer avec une version statique, où vous codez en dur dans les colonnes que vous devez d'abord transformer, puis passez à la version dynamique.