数据库之 case关键字和 pivot使用,行列转换实现

首先数据表为;

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 不会。
    在这里插入图片描述

到这里就先结束吧~

猜你喜欢

转载自blog.csdn.net/pythonstrat/article/details/111563497