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|                |
|______________________________________________________________________________________|

対応する列の各回答で、回答者ごとに 1 行を取得したいと考えています。私が作成したクエリは、回答を正しい列にピボットしますが、すべての空白列に null を含む各回答の新しい行を提供します。

私の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 

等...

于 2012-10-26T08:45:34.683 に答える