2014-01-28 4 views
0

Я пытаюсь использовать Pivot для динамического создания столбцов и не получаю надлежащих результатов, которые я ищу. Мне нужно показать все возможные ответы в своем столбце для каждого вопроса (строки), и в курсе есть несколько вопросов. Как я могу генерировать каждый возможный ответ в виде имени столбца и фильтровать по курсу Id и questionId для каждой строки? Количество возможных ответов зависит от вопроса. Должно ли это выполняться с помощью курсора вместо точки поворота?Динамические опорные столбцы со связанными таблицами на сервере Sql

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX), 
     @courseID float(24) = 1 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(questionID) 
      FROM answers 
      INNER JOIN questions ON questions.questionID = answers.questionID 
      WHERE questions.courseId = @courseID 
      order by 1 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

set @query = 'SELECT * from 
      (
       select Q.courseId, C.courseName, Q.question, Q.questionID, A.answer 
       from questions Q 
       inner join courses C ON Q.courseId = C.courseId 
       inner join answers A ON A.questionID = Q.questionID 
       where (Q.courseId = ''' + Str(@courseID) + ''') 
      ) x 
      pivot 
      (
       max(answer) 
       for questionId in (' + @cols + ') 
      ) AS p' 


execute(@query) 

При работе выше я получаю:

[1],[10],[11],[12],[13],[14],[15],[16],[2],[3],[4],[5],[6],[7],[8],[9] 

Как сгенерированных столбцов, которые являются questionIds и не «Ответ 1, Ответ 2 ... и т.д.», и они не отображаются в заказ.

Для краткости здесь являются соответствующие столбцы в таблицах базы данных:

Курсы

courseId 

Вопросы

questionId question  courseId 

Ответы

AnswerId questionId answer 

Любая помощь приветствуется.

ответ

1

Вы не предоставили много подробностей о вашей структуре таблицы, но если вы хотите, чтобы ответы, как столбцы, т.е. Answer1, Answer2, и т.д., то вам нужно создать столбцы, используя row_number() от числа ответов на вопрос, аналогичного следующий:

SET @cols = STUFF((SELECT ',' + QUOTENAME('Answer'+cast(seq as varchar(10))) 
      FROM 
      (
       select row_number() over(partition by q.questionid 
              order by a.answer) seq 
       from answers a 
       INNER JOIN questions q 
        ON q.questionID = a.questionID 
       WHERE q.courseId = @courseID 
      ) d 
      group by seq 
      order by seq 
        FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
        , 1, 1, ''); 

Это создает последовательность для каждого ответа на вопрос, а затем, что порядковый номер используется для создания новых имен столбцов. Затем вы измените код PIVOT на:

set @query = 'SELECT * 
      from 
      (
       select Q.courseId, C.className, Q.question, Q.questionID, A.answer, 
        ''Answer''+cast(row_number() over(partition by q.questionid 
                 order by a.answer) as varchar(10)) seq 
       from questions Q 
       inner join classes C 
        ON Q.courseId = C.courseId 
       inner join answers A 
        ON A.questionID = Q.questionID 
       where (Q.courseId = ''' + Str(@courseID) + ''') 
      ) x 
      pivot 
      (
       max(answer) 
       for seq in (' + @cols + ') 
      ) AS p' 


execute(@query) 
+0

Извините за отсутствие деталей. Я редактировал свой вопрос, чтобы включить некоторые из структуры таблицы. В любом случае ваш пример работал отлично. Спасибо! – Drew

Смежные вопросы