您可以执行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 |
两种解决方案都非常完美!我有多达16个答案来解决我的问题,所以第二种方法更适合我的情况。谢谢。 – user2084771 2013-02-19 13:20:27
@ user2084771欢迎您,很高兴它为您工作! :) – Taryn 2013-02-19 13:52:51