1

我正在尝试编写一个创建数据透视表的 sql 语句。

数据是调查响应列表,由涉及表响应者、响应和答案的连接查询组成。答案表结构如下:

______________________________________________________________
|AnswerID|ResponseID|QuestionID|AnswerComment                |
|      1 |        1 |        1 |This is answer 1             |
|      2 |        1 |        2 |This is answer 2             |
|      3 |        1 |        3 |This is answer 3             |
|      4 |        2 |        1 |Answer 1 Respondent 2        |
|      5 |        2 |        3 |Resp 2, No Q.2               |
|      6 |        3 |        2 |I answered Q.2 only          |
|____________________________________________________________|

答主长这样:

______________________________________________________________
|RespondentID|GivenName|Surname|age, gender, blah blah       |
|____________________________________________________________|

回复:

______________________________________________________________
|ResponseID|ResponseDate|RespondentID|Attachment             |
|____________________________________________________________|

和问题:

_____________________________________________________
|QuestionID|QuestionNumber|QuestionText|            |
|___________________________________________________|

我希望我的输出形式为:

________________________________________________________________________________________
|RespondentInfo|ResponseDate|1                     |2                  |3               |
|Respondent 1  |15/10/2012  |This is answer 1      |This is answer 2   |This is answer 3|
|Respondent 2  |17/10/2012  |Answer 1 Respondent 2 |                   |Resp 2, No Q.2  |
|Respondent 3  |19/10/2012  |                      |I answered Q.2 only|                |
|______________________________________________________________________________________|

我希望每个受访者在对应列中的每个答案都有一行。我创建的查询 - 尽管它将答案旋转到正确的列 - 为每个答案提供了一个新行,所有空白列都为空。

我的 sql:

SELECT Respondent, ResponseDate, 
         [1], [2], [3]
FROM  (
       SELECT  Respondent.Surname + ', ' + FirstName as RespondentInfo, 
               Response.ResponseDate, 
               isnull(Answer.AnswerComment, '') as Answer, 
               Qustion.QuestionNumber
       FROM    Answer INNER JOIN
                Question ON Answer.QuestionID = Question.QuestionID INNER JOIN
                   Response ON Answer.ResponseID = Response.ResponseID INNER JOIN
                   Respondent ON Response.RespondentID = Respondent.RespondentID
       ) as ResponseQuery
PIVOT (
    max(Answer)
FOR ResponseQuery.QuestionNumber in ([1], [2], [3])
       ) AS OutputTable

我认为问题是因为我没有使用聚合函数,所以默认为 max()。谁能指出我正确的方向。

抱歉,如果我的问题过于冗长。

4

1 回答 1

0

问题是源头,而不是支点。

没有看到其他表很难判断,但使用您的示例表

select ResponseID, [1],[2],[3] from 
    (select ResponseID, AnswerComment, QuestionID from yourtable) s
PIVOT (max(AnswerComment) FOR QuestionID in ([1], [2], [3]) ) AS OutputTable

以您所追求的形式产生输出。

如果您不知道如何调整源以提供您想要的数据,您可以通过添加类似...

 inner join Response on OutputTable.ResponseID = Response.ResponseID 

在上述枢轴之后给

select Response.ResponseDate, [1],[2],[3] from 
    (select ResponseID, AnswerComment, QuestionID from yourtable) s
PIVOT (max(AnswerComment) FOR QuestionID in ([1], [2], [3]) ) AS OutputTable
inner join Response on OutputTable.ResponseID = Response.ResponseID 

ETC...

于 2012-10-26T08:45:34.683 回答