2012-10-26 4 views
1

Я пытаюсь написать заявление sql, которое создает сводную таблицу.сводная таблица w/out функция

Данные представляют собой список ответов на опрос и составлены из запроса объединения, включающего ответы респондентов, ответ и ответ. Таблица ответ структурирован, как показано ниже:

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

Я хочу получить по одной строке ответа каждого ответчика в соответствующем столбце. Созданный вами запрос - хотя он отвечает на правильные столбцы, - содержит новую строку для каждого ответа с нулями во всех пустых столбцах.

My 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 

Я думаю, что проблема в том, что я не использую агрегатную функцию так, дефолт макс(). Может кто-то указать мне верное направление.

Извините, если мой вопрос слишком подробный.

ответ

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 

и т.д.