2013-02-18 77 views
0

我想在MS SQL 2008中重复使用2个表格,以便在单行中检索所有可用答案的调查问题。SQL 2 Dimension Pivot

表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 

我试过10种不同的Pivot,CTE和子查询的组合,但没有运气。

我应该提到没有“应答顺序”列(尚未)。真正的数据库有超过200个问题和700个答案,随时可能发生变化,因此编码每个值都是不现实的。

您的洞察力得到赞赏。

回答

2

您可以执行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 Fiddle with Demo

但如果你有数目不详的每个问题的答案,那么你就需要使用动态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 Fiddle with Demo

结果两个疑问是:

| 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 | 
+0

两种解决方案都非常完美!我有多达16个答案来解决我的问题,所以第二种方法更适合我的情况。谢谢。 – user2084771 2013-02-19 13:20:27

+0

@ user2084771欢迎您,很高兴它为您工作! :) – Taryn 2013-02-19 13:52:51