Mic*_*len 5 transpose pivot sql-server-2008
我在SQL Server 2008中有问卷数据,我想将其转置为矩阵.
我看了几篇关于同一主题的帖子,但我没有得到转动.
给出以下表格:
Question table
Answer table
Customer table
列:
[CustomerID],[QuestionName_1],...,[QuestionName_n]< - 动态数问题的列)
的数据:
CustomerID,Answer_1,...,Answer_n
检索列的代码:
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)
Run Code Online (Sandbox Code Playgroud)
最初的查询思想来自具有动态列的枢轴.
它可以完成,转动查询会是什么样子?
ps:我不想使用最大列数的排名.
问候,
米歇尔
Tar*_*ryn 15
是的,您可以执行动态透视.有时,PIVOT首先使用静态版本更容易处理查询,以便查看查询和结果的显示方式.然后将查询转换为动态版本.
以下是查询的静态与动态版本的示例:
静态(SQL小提琴):
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
Run Code Online (Sandbox Code Playgroud)
动态(SQL小提琴):
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)
Run Code Online (Sandbox Code Playgroud)
如果您可以提供有关当前表结构的更多详细信息,然后提供一些示例数据.我们应该能够帮助您创建您的情况所需的版本.
正如我所说,有时开始使用静态版本更容易,在那里您需要首先转换的列中的硬编码,然后转到动态版本.