1

MS SQL 2008で2つのテーブルをピボットして、利用可能なすべての回答を1行にまとめた調査の質問を取得したいと思います。

表1は「質問」です

ID   Text
1    What is your gender
2    Are you married
3    What is your Ethnicity

表2は、各質問の「回答」として利用できます。

ID   QuestionID   Text
1    1            Male
2    1            Female
3    2            Yes
4    2            No
5    3            Caucasian
6    3            African/Black
7    3            Hispanic
8    3            Asian
etc.

クエリの結果を次のようにしたいと思います。

QuestionID  QuestionText             Ans1       Ans2            Ans3      Ans4
1           What is your gender      Male       Female          Null      Null
2           Are you married          Yes        No              Null      Null
3           What is your Ethnicity   Caucasian  African/Black   Hispanic  Asian

Pivot、CTE、およびサブクエリの10の異なる組み合わせを試しましたが、うまくいきませんでした。

「AnswerSequence」列は(まだ)ありません。実際のDBには200を超える質問と700の回答があり、これらはいつでも変更される可能性があるため、各値をコーディングすることは実用的ではありません。

あなたの洞察は高く評価されています。

4

1 に答える 1

3

PIVOTこの結果を取得する関数を実装できます。

answersそれぞれにいくつあるかがわかっている場合はquestion、次のような値をハードコーディングできます。

select *
from
(
  select q.id,
    q.text question,
    a.text answer,
    'Answer_'+cast(row_number() over(partition by q.id 
                                      order by a.id) as varchar(10)) col
  from questions q
  left join answers a
    on q.id = a.questionid
) src
pivot
(
  max(answer)
  for col in (Answer_1, Answer_2,
             Answer_3, Answer_4)
) piv
order by id;

SQL FiddlewithDemoを参照してください

ただし、各質問に対する回答の数が不明な場合は、動的SQLを使用する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Answer_'+cast(row_number() over(partition by q.id 
                                      order by a.id) as varchar(10))) 
                    from questions q
                    left join answers a
                      on q.id = a.questionid
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, question, ' + @cols + ' from 
             (
                select q.id,
                  q.text question,
                  a.text answer,
                  ''Answer_''+cast(row_number() over(partition by q.id 
                                                    order by a.id) as varchar(10)) col
                from questions q
                left join answers a
                  on q.id = a.questionid
            ) x
            pivot 
            (
                max(answer)
                for col in (' + @cols + ')
            ) p 
            order by id'

execute(@query)

SQL FiddlewithDemoを参照してください

両方のクエリの結果は次のとおりです。

| ID |               QUESTION |  ANSWER_1 |      ANSWER_2 | ANSWER_3 | ANSWER_4 |
---------------------------------------------------------------------------------
|  1 |    What is your gender |      Male |        Female |   (null) |   (null) |
|  2 |        Are you married |       Yes |            No |   (null) |   (null) |
|  3 | What is your Ethnicity | Caucasian | African/Black | Hispanic |    Asian |
于 2013-02-18T22:39:55.593 に答える