日期:2014-05-18  浏览次数:20521 次

另一道很有挑战性的SQL语句,想了好久没想到好的办法
userid       questionid   answer
2021187 1 A
2021187 2 B
2021187 3 F
2021187 4 B
2021187 5 B
2021187 6 A
2026080 1 A
2026080 2 A
2026080 3 E
2026080 4 A
2026080 5 B
2026080 6 B
2031349 1 B
2031349 2 B
2031349 3 K
2031349 4 A
2031349 5 D
2031349 6 A

转成以下方式输出:
userid       question1     question2   question3   question4   question5   question6
2021187         A                     B                   F                   B                   B                   A
2026080         A                     A                   E                   A                   B                   B
2031349         B                     B                   K                   A                   D                   A

------解决方案--------------------
userid questionid answer
2021187 1 A
2021187 2 B
2021187 3 F
2021187 4 B
2021187 5 B
2021187 6 A


select userid ,
max(case when questionid = 1 then answer end) question1,
max(case when questionid = 2 then answer end) question2,
max(case when questionid = 3 then answer end) question3,
max(case when questionid = 4 then answer end) question4,
max(case when questionid = 5 then answer end) question5,
max(case when questionid = 6 then answer end) question6
from tb
group by userid


------解决方案--------------------
declare @sql varchar(8000)
set @sql= ' '

select @sql=@sql+ ',[question '+rtrim(questionid)+ ']=max(case questionid when '+rtrim(questionid)+ ' then answer end) '
from (select distinct questionid from 表) t

set @sql= 'select userid '+@sql+ ' from 表 group by userid '

exec(@sql)
------解决方案--------------------
create table ta(userid int, questionid int ,answer varchar(5))
insert ta select 2021187, 1, 'A '
insert ta select 2021187, 2, 'B '
insert ta select 2021187, 3, 'F '
insert ta select 2021187, 4, 'B '
insert ta select 2021187, 5, 'B '
insert ta select 2021187, 6, 'A '
insert ta select 2026080, 1, 'A '
insert ta select 2026080, 2, 'A '
insert ta select 2026080, 3, 'E '
insert ta select 2026080, 4, 'A '
insert ta select 2026080, 5, 'B '
insert ta select 2026080, 6, 'B '
insert ta select 2031349, 1, 'B '
insert ta select 2031349, 2, 'B '
insert ta select 2031349, 3, 'K '
insert ta select 2031349, 4, 'A '
insert ta select 2031349, 5, 'D '