我有一个表 Survey_Data_Response,其中填充了来自两个表(Survey_Question 和 Survey_Response)的“插入”语句,它们在 QuestionID 上连接。
我想使用 SP 来透视 Survey_Data_Response 表并将结果保存到临时表中,以便我可以查询它来开发报告。
Survey_Data_Response 表包含字段 - QuestionID、ResponseID、Question、Response、ResponseDateTime、moduleID。
问题数量可能会根据调查而变化。
QuestionID Question Response ResponseDateTime ResponseID ModuleID
123 Age 34 2011-06-06 18:21:00 ABC 123
345 Gender M 2011-06-06 18:21:00 DEF 123
567 Phone 444-4444 2011-06-06 18:21:00 HIG 123
123 Age 23 2011-06-07 12:01:00 MNO 123
789 Postal Code 90988 2011-06-07 12:01:00 XYZ 123
我需要将表格旋转为如下所示,问题为列,答案在相应的字段中。
ResponseID Age Gender Phone Postal Code ResponsDateTime
ABC 34 M 444-4444 2011-06-06 18:21:00
XYZ 23 90988 2011-06-07 12:01:00
在过去的两天里,我尝试了多次枢轴查询,但没有任何运气。这就是我所在的位置,它返回列标题,但没有填充问题的答案。
DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT @cols = STUFF(( SELECT distinct ',' + QuoteName(question)
FROM temp_SURVEY_DATA FOR XML PATH('') ), 1, 1, '')
SET @sqlquery = 'SELECT * FROM
(SELECT DynamicQuestionResponseID,question,moduleid
FROM temp_SURVEY_DATA ) base
PIVOT (max(moduleid) FOR question
IN (' + @cols + ')) AS finalpivot'
EXECUTE ( @sqlquery )
有人可以帮助我理解为什么这个 Pivot 不起作用以及如何让它起作用吗?
谢谢
最佳答案
这应该给你你想要的:
create table temp_SURVEY_DATA
(
questionid int,
question varchar(50),
response varchar(50),
responsedatetime datetime,
responseid varchar(3),
moduleid int
)
insert into temp_SURVEY_DATA values(123, 'Age', '34', '2011-06-06 18:21:00', 'ABC', 123)
insert into temp_SURVEY_DATA values(345, 'Gender', 'M', '2011-06-06 18:21:00', 'ABC', 123)
insert into temp_SURVEY_DATA values(567, 'Phone', '444-4444', '2011-06-06 18:21:00', 'ABC', 123)
insert into temp_SURVEY_DATA values(123, 'Age', '23', '2011-06-07 12:01:00', 'XYZ', 123)
insert into temp_SURVEY_DATA values(789, 'Postal Code', '90988', '2011-06-07 12:01:00', 'XYZ', 123)
DECLARE @cols AS VARCHAR(MAX),
@query AS VARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question)
FROM dbo.temp_SURVEY_DATA c
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT responseid, moduleid, responsedatetime, ' + @cols + ' from
(
select question, response, responsedatetime, responseid, moduleid
from temp_SURVEY_DATA
) x
pivot
(
max(response)
for question IN(' + @cols + ')
) p '
execute(@query)
结果:
responseid moduleid responsedatetime Age Gender Phone Postal Code
ABC 123 2011-06-06 18:21:00.000 34 M 444-4444
XYZ 123 2011-06-07 12:01:00.000 23 90988
关于sql - 存储过程使用临时表创建数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049464/