首先数据表为;
create TABLE S_score2(
id int PRIMARY KEY,
姓名 char(10),
课程 char(10) ,
分数 int
);
insert into S_score2
values(1, '张三', '语文' , 89),
(2, '张三', '数学' , 98),
(3, '张三', '英语' , 77),
(4, '李四', '语文' , 90),
(5, '李四', '数学' , 90);
- 查询出来:
要求:
- 查询结果如下:
我们会采用 case 字段名 when 字段值 then 字段名代表的字段值 end
来完成, 参考文章:
比较易懂, 详细的信息
分析:
- 一。 首先我们知道, 数学,语文等, 是原表的 字段值, 我们需要查询出来,作为字段名,所以要构造这些字段名
select 姓名,
CASE 课程
when '语文' then 分数 else 0 end as 语文,
CASE 课程
when '数学' then 分数 else 0 end as 数学,
CASE 课程
when '英语' then 分数 else 0 end as 英语
from S_score2;
- 结果:
- 分析
- 1.我们select 查询语句后面构造出来了我们想要的字段
- 2 当程序遍历(select) 原表(S_score2) 中的每一条记录时,按照我们的思路去输出结果
- 首先 有一个 名字 字段
- 然后 进入第一个 case字段,通过 课程字段的值,如果是 ‘语文’ ,那么就给它的结果 是 对应本条记录 分数字段的 值, 如果不是 ‘语文’,那么 这个字段的值,就给 0.
- 后面的 数学, 英语 相同
- 这样执行也就出现了 每条记录都有 语文,数学, 英语三个字段了。
- 二。下一步,根据我们初步的结果,只需要使用聚合函数 SUM,就可以得到综合的结果,应为 对应的每条记录都是 0,只有一个字段有值。
select 姓名,
sum(CASE 课程
when '语文' then 分数 else 0 end) as 语文,
sum(CASE 课程
when '数学' then 分数 else 0 end) as 数学,
sum(CASE 课程
when '英语' then 分数 else 0 end) as 英语
from S_score2 group by(姓名);
insert into S_score1
values(1, '张三', 90 , 89 , 70),
(2, '李四', 91 , 80 , 88);
select * from S_score1;
解决: 使用 集合操作 union, 资料111页,交并差操作。
select 姓名,
'语文' as 课程,
语文 as 分数
from S_score1
union all
select 姓名,
'数学' as 课程,
数学 as 分数
from S_score1
union all
select 姓名,
'英语' as 课程,
英语 as 分数
from S_score1
order by 姓名 desc;
- 集合操作需要注意:
union 会自动去掉重复的元素,而 union all 不会。
到这里就先结束吧~