2014-09-12 40 views
0

我有以下兩個表:加入動態SQL當建築物立柱頭

測驗表:

QuizNo | Status 
    1  Reviewed 
    2  Not Reviewed 

測驗響應表:

QuizNo | QuestionID | Response 
1    11   Yes 
2    13   No 
2    11   Yes 
1    13   No 

這是預期的結果(11 13是問號ID):

QuizNo | Status  | 11 | 13 
    1  Reviewed  Yes  No 
    2  Not Reviewed Yes  No 

這是我目前的查詢,這是不正常:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(QuestionID) 
        from Quiz 
        INNER JOIN QuizResponse x ON QuizNo = x.QuizNo 
        group by QuestionID, QuizNo 
        order by QuestionID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

set @query = N'SELECT ' + @cols + N' from 
      (
       select QuestionID 
       from QuizResponse 
      ) x 
      pivot 
      (
       max(QuestionID) 
       for QuestionID in (' + @cols + N') 
      ) p ' 

exec sp_executesql @query; 

你將如何完成/更改查詢,以獲得預期的結果?

TIA!

+0

「*這是我當前的查詢,它不起作用*」,這是什麼意思?,它返回什麼? – Lamak 2014-09-12 15:16:01

+0

你的表格被稱爲「測驗」和「測驗回答」。您的示例代碼沒有這些表格。請修復這個問題。 – 2014-09-12 15:17:55

+0

稍微擴展你以前的問題的版本:http://stackoverflow.com/questions/25810330/values-to-column-headers – Tanner 2014-09-12 15:19:42

回答

1

你接近,但有查詢之前需要幾件事情可能是完整的。

Stuff函數中的Query需要同時指定QuizNo和表別名。它也不應該按QuizID進行分組,否則最終會出現重複的列定義(每個QuizID帶有一個QuestionID 11,每個列定義一個[11])。所以整理了一下。

最後,更新動態SQL以選擇未被旋轉的列,並​​選擇max(Response)而不是QuestionID作爲每個單元格的數據。

請參閱SQLFiddle example

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(QuestionID) 
        from Quiz Q 
        INNER JOIN QuizResponse x ON Q.QuizNo = x.QuizNo 
        GROUP BY QuestionID 
        ORDER BY QuestionID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

set @query = N'SELECT QuizNo, [Status], ' + @cols + N' from 
      (
       select QR.QuizNo, Q.[Status], QR.QuestionID, QR.Response 
       from QuizResponse QR 
        inner join Quiz Q on QR.QuizNo = Q.QuizNo 
      ) x 
      pivot 
      (
       max(Response) 
       for QuestionID in (' + @cols + N') 
      ) p ' 

exec sp_executesql @query; 
0

我會做這個使用條件彙總:

select q.quizno, q.status, 
     max(case when qr.questionid = 11 then qr.response end) as [11], 
     max(case when qr.questionid = 13 then qr.response end) as [13] 
from quiz q join 
    quizreponse qr 
    on qr.quizno = q.quizno 
group by q.quizno, q.status; 
+0

是否有可能以可以動態讀取問題ID的方式進行操作?意思是,我有8000個問題ID ... – user3010406 2014-09-12 15:28:25

+0

在這種情況下,不,因爲8000超過了表/結果集的列數限制。 – 2014-09-12 15:36:40

+0

如果只有300個ID,該怎麼辦? – user3010406 2014-09-12 15:39:13