gpt4 book ai didi

sql-server-2008 - 透视动态列,无聚合

转载 作者:行者123 更新时间:2023-12-04 16:40:27 24 4
gpt4 key购买 nike

我有 SQL Server 2008 中的问卷数据,我想将其转置为矩阵。
我看到了几篇关于同一主题的帖子,但我就是不明白。

给出了以下表格:
Question tableAnswer tableCustomer 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)

最初的查询想法取自 pivots with dynamic columns .

它可以完成吗?旋转查询会是什么样子?
ps:我不想使用具有最大列数的排名。

问候,

米歇尔

最佳答案

是的,您可以执行动态枢轴。有时更容易处理 PIVOT 首先使用静态版本查询,以便您可以查看查询和结果的显示方式。然后将查询转换为动态版本。

以下是查询的静态与动态版本的示例:

静态 ( 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

动态 ( 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)

如果您可以提供有关当前表结构的更多详细信息,然后提供一些示例数据。我们应该能够帮助您创建适合您情况的版本。

不过,正如我所说,有时从静态版本开始更容易,您可以先在需要转换的列中进行硬编码,然后再转到动态版本。

关于sql-server-2008 - 透视动态列,无聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11985796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com