Mysql行转列与列转行分析

本文分享了SQL中行转列的具体操作方法,包括使用MAX或SUM函数避免NULL值,以及如何通过CASE语句将成绩转换为等级评定。同时,介绍了列转行的实现方式,利用UNION合并查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为菜鸟初学者去面试时,总会遇到一些没见到过的面试题,总是拔凉拔凉的,赶紧去查了下大佬们怎么做的,然后自己尝试后在这里做个总结,记录自己不堪的经历

  1. 行转列问题,有表如下
    在这里插入图片描述
    现在希望把表的内容展示为:
    在这里插入图片描述
    书写语句如下`
SELECT user_name ,
    MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
    MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
    MAX(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM stu_grade
GROUP BY USER_NAME;

这里使用max()函数,是为了不让查询课程缺失时,出现null值,也可以使用sum()函数,查询结果也一样,语句如下:

SELECT user_name ,
    SUM(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
    SUM(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
    SUM(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM stu_grade
GROUP BY USER_NAME;

我也试了下不用MAX()或SUM()函数会出现的结果:

在这里插入图片描述
完全没查出想要的结果来… 除了数学这列,其余的语文,英语分数根本没对。
反复尝试了几次,发现是数学这列把后面语文英语的成绩置零了,下面这样写就没问题,也可以得到正确结果;
在这里插入图片描述

  1. 列转行的问题,跟刚才正好想法,我就不多贴图了,使用的建表语句与上面稍微不同,如下:
CREATE TABLE `stu_grade2` (
  `ID` int(10) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(20) DEFAULT NULL,
  `CN_SCORE` float DEFAULT NULL,
  `MATH_SCORE` float DEFAULT NULL,
  `EN_SCORE` float DEFAULT '0',
  PRIMARY KEY (`ID`)
)
	查询语句使用了UNION ,将几条查询的结果作了合并,语句如下:
SELECT user_name, '语文' COURSE , CN_SCORE as SCORE from stu_grade2
UNION 
SELECT user_name, '数学' COURSE, MATH_SCORE as SCORE from stu_grade2
UNION
SELECT user_name, '英语' COURSE, EN_SCORE as SCORE from stu_grade2
ORDER BY user_name,COURSE;

显示的查询结果为:

在这里插入图片描述
要想使成绩显示为优良中差不及格几等,可以使用如下语句:

SELECT user_name, '语文' COURSE , 
CASE WHEN CN_SCORE>=90 THEN '优'
	WHEN CN_SCORE>=80 THEN '良'
	WHEN CN_SCORE>=70 THEN '中'
	WHEN CN_SCORE>=60 THEN '差'
	ELSE '不及格' END
 as SCORE from stu_grade2
UNION
SELECT user_name, '英语' COURSE , 
CASE WHEN EN_SCORE>=90 THEN '优'
	WHEN EN_SCORE>=80 THEN '良'
	WHEN EN_SCORE>=70 THEN '中'
	WHEN EN_SCORE>=60 THEN '差'
	ELSE '不及格' END
 as SCORE from stu_grade2
UNION
SELECT user_name, '数学' COURSE , 
CASE WHEN MATH_SCORE >=90 THEN '优'
	WHEN MATH_SCORE>=80 THEN '良'
	WHEN MATH_SCORE>=70 THEN '中'
	WHEN MATH_SCORE>=60 THEN '差'
	ELSE '不及格' END
 as SCORE from stu_grade2

展示结果为:
在这里插入图片描述

参考资料1
参考文章2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值