case when 行转列,出现空值处理

1. 创建测试表

1 create table tb_class (
2 id int identity(1,1) primary key,
3 name nvarchar(10),
4 subject nvarchar(10),
5 score smallint
6 )

2. 插入数据

1 insert into tb_class (name,subject,score) values 
2 ('张三',   '语文'  , 80 ),
3 ('张三 '  ,'数学'  , 70 ),
4 ('张三' ,  '英语' ,  60 ),
5 ('李四 ',  '语文' ,  90 ),
6 ('李四 ' , '数学'  , 80 ),
7 ('李四'  , '英语',   100 )

3. 查看数据表

 select name,subject,score  from tb_class
---------------------------------------------
name subject score 张三 语文 80 张三 数学 70 张三 英语 60 李四 语文 90 李四 数学 80 李四 英语 100

4. 需求 case when转换成 科目为列标题

1 select name,
2 case subject when '语文' then score end 语文 ,
3 case subject when '数学' then score end  数学,
4 case subject when '英语' then score end  英语
5 from tb_class

 

 问题:case when之后出现许多空值

 解决:使用group by聚合name列

1 select name,
2 case subject when '语文' then score end 语文 ,
3 case subject when '数学' then score end  数学,
4 case subject when '英语' then score end  英语
5 from tb_class
6 group by name

 

 

报错处理,将case when用聚合功能包装一下:

1 select name,
2 max(case subject when '语文' then score end) 语文 ,
3 max(case subject when '数学' then score end)  数学,
4 max(case subject when '英语' then score end ) 英语
5 from tb_class
6 group by name

 

 

 

posted @ 2020-12-25 16:20  xTimeless  阅读(1366)  评论(0)    收藏  举报