千家信息网

sql行转列、列转行的方法

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,如题:有一张表EMP,里面有两个字段:name,chengji 有三条记录,分别表示语文(name) 70分,数学(name) 80分,英语(name) 58分,请用一条sql查询出这三条记录并以条件
千家信息网最后更新 2026年11月01日sql行转列、列转行的方法

如题:有一张表EMP,里面有两个字段:name,chengji 有三条记录,分别表示语文(name) 70分,数学(name) 80分,英语(name) 58分,请用一条sql查询出这三条记录并以条件显示出来,大于等于80表示优秀,大于等于60表示及格,小于60分表示不及格!要求显示格式如上!

首先我们创建表,添加如题数据!

CREATE TABLE emp(NAME VARCHAR(20),chengji INT);

INSERT INTO emp VALUES('语文',70),('数学',80),('英语',58);

根据题目要求,我们需要将这三行的结果做判断,然后以列的形式显示,这其中有一个行转列的操作。


第一种sql写法:


SELECT MAX(CASE WHEN NAME='语文' THEN (CASE WHEN chengji>=80 THEN '优秀' WHEN chengji<80 AND chengji>=60 THEN '及格' ELSE '不及格' END) ELSE '' END) '语文' ,

MAX(CASE WHEN NAME='数学' THEN (CASE WHEN chengji>=80 THEN '优秀' WHEN chengji<80 AND chengji>=60 THEN '及格' ELSE '不及格' END) ELSE '' END) '数学',

MAX(CASE WHEN NAME='英语' THEN (CASE WHEN chengji>=80 THEN '优秀' WHEN chengji<80 AND chengji>=60 THEN '及格' ELSE '不及格' END) ELSE '' END ) '英语' FROM emp

执行结果如下:

备注:上述sql中使用了max(case)这种用法,max这里的主要作用是为了在3次判断中,取到不为空字符串''的标题,语文,数学,英语!


第二种写法采用group_concat函数也是可以拼接出如图所有要的结果写法如下:


SELECT GROUP_CONCAT(NAME SEPARATOR '|') FROM emp UNION ALL SELECT

GROUP_CONCAT(CASE WHEN chengji>=80 THEN '优秀' WHEN chengji<80 AND chengji>=60 THEN '及格' ELSE '不及格' END SEPARATOR '|' ) FROM emp

执行结果如下:

这样看,这个结果也还是可以接受, 这里采用了group_concat函数,将列的类容连接起来,作为行!不过这样的结果有点生硬的感觉!


补充一点:这里的sql写法我们可以看出,如果想要通过第一种写法。我们前面必须要知道列的内容如语文,数学,英语,但是第二种我们却不用知道! 这里我们想到了一种方法,通过存储过程,将想要的第一种方法的sql拼出来,然后执行这样的话,后面如果我们的表再添加列,或者减少列,也不会报错!

写法如下:

DELIMITER $$


USE `yhtest`$$


DROP PROCEDURE IF EXISTS `yhtest`$$


CREATE DEFINER=`root`@`%` PROCEDURE `yhtest`()

BEGIN

SET @sql = NULL;

SELECT

GROUP_CONCAT(DISTINCT

CONCAT(

'MAX(CASE WHEN NAME=','\'',emp.name,'\'','THEN (CASE WHEN chengji>=80 THEN ', '\'' ,'优秀','\'' ,' WHEN

chengji<80 AND chengji>=60 THEN ', '\'' ,'及格' ,'\'' ,' ELSE ', '\'' ,'不及格' ,'\'' ,' END) ELSE ', '\'','\'',' END) ','\'',emp.name,'\''

)

)

INTO @sql

FROM emp ;

SET @sql = CONCAT('select ',@sql, ' from emp');

PREPARE stmt1 FROM @sql;

EXECUTE stmt1;

DEALLOCATE PREPARE stmt1;

END$$


DELIMITER ;

调用一下: call yhtest();

插入几条数据!我们假设提前不知道有多少个科目!

INSERT INTO emp VALUES('物理',72),('体育',84);

这里有个问题!由于我们在存储过程中使用了group_concat函数,这个拼接函数最大拼接长度为1024(默认) 超过固定长度,截断处理! 由数据库参数group_concat_max_len 控制!我们可以根据需要认为调整!


group_concat 调整拼接符号 :group_concat(name separator '_')

group_concat 排序:group_concat(name order by name separator '_')



优秀 写法 数学 结果 语文 英语 函数 数据 方法 过程 长度 三条 存储 调整 最大 生硬 这样的话 不用 两个 体育 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 北京路客互联网科技有限公司 互联网科技工作委员会副主任毛军 平安科技 互联网 互联网 科技创业 广州宏创互联网科技 云电互联网科技 银优互联网科技有限公司 苏州大垚互联网科技 互联网养老 桔豆科技 老年人脱离互联网科技的作文 中国科技互联网公司收入 新兴科技互联网创新大赛颁奖典礼 恒生互联网科技指数跳水 浙南科技城互联网大厦建设工程 中国互联网公司排名锤子科技 互联网科技公司营业执照怎么办理 小米互联网科技园入驻 上海钢联属于互联网科技股吗 广州千川互联网科技有限公司 互联网科技资金流入 科技互联网龙头 河南真二互联网科技有限公司 互联网 科技公司 互联网科技的发展 华宇互联网科技 广州互联网络科技有限公司 奇酷互联网络科技公司 科技互联网公司logo 上海亿帐通互联网科技 荆州市昕露互联网络科技有限公司
0