sql-server-2008 - pasar - pivot}sql server ejemplo
Columnas dinámicas pivote, sin agregación (1)
Sí, puedes realizar un pivote dinámico. A veces es más fácil trabajar con la consulta PIVOT
usando una versión estática primero para que pueda ver cómo aparecerá la consulta y los resultados. Luego transforma la consulta en una versión dinámica.
Aquí hay un ejemplo de una versión estática vs. dinámica de una 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)
Si puede proporcionar más detalles sobre su estructura de tabla actual y algunos datos de muestra. Deberíamos poder ayudarlo a crear la versión que necesitaría para su situación.
Sin embargo, como dije antes, a veces es más fácil comenzar con una versión estática, donde codifica las columnas que necesita transformar primero, luego pasa a la versión dinámica.
Tengo datos del cuestionario en SQL Server 2008, que quiero transponer a una matriz.
Vi varias publicaciones sobre el mismo tema, pero simplemente no me hago pivotar.
Se dan las siguientes tablas:
Question table
Answer table
Customer table
Las columnas:
[CustomerID]
, [QuestionName_1]
, .., [QuestionName_n]
<- número dinámico de columnas de preguntas)
Los datos:
CustomerID
, Answer_1
, .., Answer_n
El código para recuperar las columnas:
DECLARE @columns VARCHAR(8000)
SELECT @columns = COALESCE(@columns + '',['' + cast(QuestionName as varchar) + '']'',
''['' + cast(QuestionName as varchar)+ '']'')
FROM Answer A
INNER JOIN Question Q ON A.QuestionID = Q.QuestionID
INNER JOIN Customer C ON A.CustomerID = C.CustomerID
GROUP BY Q.QuestionName
SET @columns = ''[CustomerID],'' + @columns
DECLARE @query VARCHAR(8000)
SET @query = ''Some PIVOT query without aggregation''
EXECUTE(@query)
La idea de consulta inicial se tomó de pivots con columnas dinámicas .
¿Se puede hacer y cómo sería la consulta pivotante?
ps: no quiero usar la clasificación con un número máximo de columnas.
Saludos,
Michel