【问题标题】:Stored Procedure create Pivot Table using a Temp Table存储过程使用临时表创建数据透视表
【发布时间】:2012-04-06 21:28:33
【问题描述】:

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

在过去 2 天里,我尝试了无数次数据透视查询,但都没有成功。这就是我所在的位置,它返回列标题,但没有填充对问题的响应。

 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 不起作用以及如何使它起作用?

谢谢

【问题讨论】:

    标签: sql sql-server pivot pivot-table


    【解决方案1】:

    这应该给你你想要的:

    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
    

    【讨论】:

    • 挑战在于问题是动态的,每个调查都会发生变化(每个调查都有不同的 moduleid)。我提供的查询将为每个问题创建列,如何在每个问题下获得适当的响应?感谢您的帮助。
    • 这将动态获取问题列表并将其转换为您的列标题,并且响应将与每个问题相关联。如果您在上面的测试中添加其他信息,您将看到正确的答案转到正确的问题
    • 是的,我现在看到了。谢谢蓝脚。我意识到我提供了一些错误信息,每个响应的 responseID 都不同。这就是为什么我没有得到我预期的结果。谢谢你帮我找到那个。查询将如何更改的任何建议。我一直在玩它并不断出错。我会更新开场评论。
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多