2012-04-06 112 views
1

我有一個表Survey_Data_Response用兩個表中的「insert into」語句填充 - 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不工作,以及如何使它工作?

感謝

回答

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 
+0

面臨的挑戰是,問題是動態的,他們改變每個調查(每次調查都有一個不同的模塊)。我提供的查詢將爲每個問題創建列,我如何在每個問題下獲得適當的答案?我感謝您的幫助。 – Stan 2012-04-06 22:14:46

+0

這將動態地獲取問題列表並將其轉換爲列標題,並且響應將與每個問題相關聯。如果您在上面的測試中添加其他信息,您會看到正確的答案轉到正確的問題 – Taryn 2012-04-06 22:25:56

+0

是的,我現在看到它。謝謝bluefeet。我意識到我提供了一些錯誤信息,responseID對於每個響應都是不同的。這就是爲什麼我沒有得到我期望的結果。感謝您幫助我找到答案。任何建議如何改變查詢。我一直在玩弄它,並繼續陷入錯誤。我會更新開幕評論。 – Stan 2012-04-06 23:16:56

相關問題