sql - 存储过程使用临时表创建数据透视表

标签 sql sql-server pivot pivot-table

我有一个表 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/

相关文章:

sql-server - 如何读取包含 SQL 代码的文本文件并执行它

sql - 做一个计数 MySQL 查询?

sql - 嵌套 SQL 聚合函数查询以获取每位经理的最低工资员工 : My Query Is Not Working

c# - 映射 GridView ASP/C# 的单元格/列中的值

sql-server - 为什么我可以从 SQL Server 运行 .bat 而不是 .exe?

sql-server - 将所有存储过程和函数一次从一个 sql server 复制到另一个的最简单方法

pivot - 雪花脱节

sql - 在 MS Access 中透视数据

mysql - select 语句将一个表中的列相乘,然后添加另一表中的列

sql - 如何计算一列的累计数字?