2014-09-12 39 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