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.