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.