横表、纵表转换!
数据库中有一张表TableA,有三个列,
Name代表姓名,Course代表学科的名字,Grade代表成绩,有如下的数据:
TableA
Name | Course | Grade |
---|---|---|
张三 | 语文 | 75 |
张三 | 数学 | 80 |
张三 | 英语 | 90 |
李四 | 语文 | 95 |
李四 | 数学 | 55 |
要求输出如下格式
Name | 语文 | 数学 | 英语 |
---|---|---|---|
张三 | 75 | 80 | 90 |
张三 | 95 | 55 | 0 |
分析
第一步
select name,
(case Course when '语文' then Grade else 0 end) as 语文 ,
(case Course when '语文' then Grade else 0 end) as 数学,
(case Course when '语文' then Grade else 0 end) as 英语
from TableA
结果为:
Name | 语文 | 数学 | 英语 |
---|---|---|---|
张三 | 75 | 0 | 0 |
张三 | 0 | 80 | 0 |
张三 | 0 | 0 | 90 |
李四 | 95 | 0 | 0 |
李四 | 0 | 55 | 0 |
第二步
select Name,
sum(case Course when '语文' then Grade else 0 end) as 语文 ,
sum(case Course when '语文' then Grade else 0 end) as 数学,
sum(case Course when '语文' then Grade else 0 end) as 英语
from TableA group by Name
这样子就大功告成了。
另附:
SQL命令中的case…when…then…else…end条件查询(不同于where)用法
case…when…then…else…end,是在from前面,可以改变记录中某字段的值,不能决定是否显示该记录;
where,是在from后面,不可以改变记录中某字段的值,但可以决定是否显示该记录。
case…when…then…else…end,可用于对同一记录的多个字段求和,带分支判断。