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
