Проблема с PIVOT в SQL (Azure SQL) - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужно перечислить ответы на опрос в одну строку.В таблице ответов на опросы перечислены queryID и ResponseID (это вопросы с несколькими вариантами ответов), поэтому по одной строке для каждого ответа.Есть 12 вопросов.Такие вещи, как дата ответа, работник, который проводил опрос, и работник, который вошел в опрос, хранятся в других таблицах.

Итак, у меня есть запрос, который получает ответы для одного опроса в 12 строк.Теперь мне нужно собрать все это в один ряд.Pivot, верно?

Но я так и не смог заставить его работать.:-( Пробовал несколько решений с этого и других форумов (включая документацию Микки здесь: https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017).

Затем я нашел это решение, которое вообще не использует сводку, здесь: Группировка сводных таблиц SQL

Отлично сработало, но в примере есть только два вопроса. В некоторых наших опросах будет более 50 вопросов, поэтому я предполагаю, что это не будет очень элегантным решением.

Итак, я вернулся к своей основной проблеме.

Уровень опыта находится где-то между идиотом и новичком, так что я, вероятно, упускаю что-то очевидное.

Вот запрос сам по себе (работает какОжидается):

SELECT AssessmentResponses.ID, AssessmentQuestions.QuestionNumber, 
   AssessmentResponseAnswers.QuestionID,
   AssessmentAnswerChoices.AnswerChoiceNumber 
FROM (AssessmentResponses RIGHT JOIN AssessmentResponseAnswers 
   ON AssessmentResponses.ID = AssessmentResponseAnswers.AssessmentResponseID) 
   LEFT JOIN (AssessmentQuestions RIGHT JOIN AssessmentAnswerChoices 
   ON AssessmentQuestions.ID = AssessmentAnswerChoices.AssessmentQuestionID) 
   ON AssessmentResponseAnswers.AnswerChoiceID = AssessmentAnswerChoices.AnswerChoiceID 
WHERE AssessmentResponses.AssessmentID = 1 AND AssessmentResponses.RespondentID = 44;

Вот как я пытался сделать его сводным:

SELECT ID, [1A], [1B], [2A], [2B], [3A], [3B], [4A], [4B], [5A], [5B], [6A], [6B] 
FROM (
SELECT AssessmentResponses.ID, AssessmentQuestions.QuestionNumber, 
   AssessmentResponseAnswers.QuestionID,
   AssessmentAnswerChoices.AnswerChoiceNumber 
FROM (AssessmentResponses RIGHT JOIN AssessmentResponseAnswers 
   ON AssessmentResponses.ID = AssessmentResponseAnswers.AssessmentResponseID) 
   LEFT JOIN (AssessmentQuestions RIGHT JOIN AssessmentAnswerChoices 
   ON AssessmentQuestions.ID = AssessmentAnswerChoices.AssessmentQuestionID)
   ON AssessmentResponseAnswers.AnswerChoiceID = AssessmentAnswerChoices.AnswerChoiceID 
WHERE AssessmentResponses.AssessmentID = 1 AND AssessmentResponses.RespondentID = 44
) AS Src 
PIVOT
(
MAX(AnswerChoiceNumber) 
FOR QuestionNumber IN ([1A], [1B], [2A], [2B], [3A], [3B], [4A], [4B], [5A], [5B], [6A], [6B]) 
)
AS Pvt;

Я надеялся, что это даст мне 1 строку с 13 столбцами (идентификатор плюс двенадцать вопросов).Но он дал мне еще 12 строк: там есть 13 столбцов, и он просто дает нулевые значения для 11 из двенадцати вопросов (в строке 1 у 1А есть ответ; в строке 2 у 1В есть ответ и т. Д.)

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Немного подправил ваш код, чтобы избавиться от "QuestionID" в подзапросе. Он не связан с тем, над чем вы работаете, поэтому SQL Server будет думать, что это один из ваших ключей.

SELECT ID, [1A], [1B], [2A], [2B], [3A], [3B], [4A], [4B], [5A], [5B], [6A], [6B] 
FROM (
SELECT AssessmentResponses.ID, AssessmentQuestions.QuestionNumber, 
   AssessmentAnswerChoices.AnswerChoiceNumber 
FROM (AssessmentResponses RIGHT JOIN AssessmentResponseAnswers 
   ON AssessmentResponses.ID = AssessmentResponseAnswers.AssessmentResponseID) 
   LEFT JOIN (AssessmentQuestions RIGHT JOIN AssessmentAnswerChoices 
   ON AssessmentQuestions.ID = AssessmentAnswerChoices.AssessmentQuestionID)
   ON AssessmentResponseAnswers.AnswerChoiceID = AssessmentAnswerChoices.AnswerChoiceID 
WHERE AssessmentResponses.AssessmentID = 1 AND AssessmentResponses.RespondentID = 44
) AS Src 
PIVOT
(
MAX(AnswerChoiceNumber) 
FOR QuestionNumber IN ([1A], [1B], [2A], [2B], [3A], [3B], [4A], [4B], [5A], [5B], [6A], [6B]) 
)
AS Pvt;

Полагаю, вы привыкли к дизайнеру. Несколько советов (не реализованных выше), чтобы сделать код более читабельным:

  • Обычно вы можете опустить круглые скобки вокруг ваших операторов объединения
  • Я бы заново обработал ваши объединения, чтобы связать по одному заявлению на оператор объединения
  • алиасов!
0 голосов
/ 18 апреля 2019

По-моему, это не совсем работа с Pivot.Может быть, так:

SELECT ar.ID
,(
  SELECT aac.AnswerChoiceNumber
  FROM AssessmentResponseAnswers ara, AssessmentAnswerChoices aac, AssessmentQuestions aq
  WHERE ar.ID=ara.AssessmentResponseID
  AND ara.AnswerChoiceID=aac.AnswerChoiceID
  AND aq.ID=aac.AssessmentQuestionID
  AND aq.QuestionNumber='1A'
 ) 1A
 ,(
  SELECT aac.AnswerChoiceNumber
  FROM AssessmentResponseAnswers ara, AssessmentAnswerChoices aac, AssessmentQuestions aq
  WHERE ar.ID=ara.AssessmentResponseID
  AND ara.AnswerChoiceID=aac.AnswerChoiceID
  AND aq.ID=aac.AssessmentQuestionID
  AND aq.QuestionNumber='1B'
 ) 1B
, (...)
FROM AssessmentResponses ar
WHERE ar.AssessmentID=1 
AND ar.RespondentID=44

У меня были проблемы с использованием соединений, но я пытался это выяснить - возможно, это правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...