2014-01-28 1 views
0

Pivot을 사용하여 동적으로 열을 만들려고하고 있는데 내가 찾고있는 적절한 결과를 얻지 못하고 있습니다. 각 질문 (행)마다 가능한 모든 답변을 자체 열에 표시해야하며 코스에 여러 질문이 있습니다. 각 가능한 답변을 열 이름으로 어떻게 생성하고 각 행에 대해 courseId 및 questionId로 필터링 할 수 있습니까? 가능한 답의 수는 질문에 따라 다릅니다. 피벗 대신 커서를 통해이 작업을 수행해야합니까? 내가 무엇입니까 위 실행하는 경우SQL Server에 관련된 테이블이있는 동적 피벗 열

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) 

다음 questionIds과하지 않은 생성 된 컬럼으로

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

을 '등 ... (2) 답변 1 답변', 그들은에 표시되지 않습니다 주문.

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