Mysql行列转换

本文详细介绍了使用MYSQL创建表、插入数据,并通过多种方法进行数据汇总,包括使用SUM(IF())函数结合WITHROLLUP和UNION操作符实现复杂的汇总逻辑。

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

前一段时间,学习了MYSQL,将一些比较常用的语句记录如下,以备以后查阅。

 

一、创建表
DROP TABLE IF EXISTS tb;

CREATE TABLE tb(姓名 VARCHAR(10),课程 VARCHAR(10),分数 INT);
INSERT INTO tb VALUES('张三','语文',74);
INSERT INTO tb VALUES('张三','数学',83);
INSERT INTO tb VALUES('张三','物理',93);
INSERT INTO tb VALUES('李四','语文',74);
INSERT INTO tb VALUES('李四','数学',84);
INSERT INTO tb VALUES('李四','物理',94);

SELECT * FROM tb

1. 利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用IFNULL将汇总行标题显示为 Total
SELECT
IFNULL(c1,'姓名') AS 姓名,
SUM(IF(c2='语文',c3,0)) AS 语文,
SUM(IF(c2='数学',c3,0)) AS 数学,
SUM(IF(c2='物理',c3,0)) AS 物理,
SUM(IF(c2='total',c3,0)) AS 总分
FROM (
SELECT 姓名 c1,IFNULL(课程,'total') AS c2,SUM(分数) AS c3
FROM tb GROUP BY 姓名,课程
WITH ROLLUP
HAVING 姓名 IS NOT NULL
) AS A
GROUP BY c1
WITH ROLLUP;

2. 利用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为Total
SELECT 姓名,
SUM(IF(课程='语文',分数,0)) AS 语文,
SUM(IF(课程='数学',分数,0)) AS 数学,
SUM(IF(课程='物理',分数,0)) AS 物理,
SUM(分数) 总分
FROM tb
GROUP BY 姓名
UNION
SELECT '合计',
SUM(IF(课程='语文',分数,0)) AS 语文,
SUM(IF(课程='数学',分数,0)) AS 数学,
SUM(IF(课程='物理',分数,0)) AS 物理,
SUM(分数) 总分 FROM tb;

3. 利用SUM(IF())生成列,直接生成结果不再利用子查询
SELECT
IFNULL(姓名,'合计') 姓名,
SUM(IF(课程='语文',分数,0)) AS 语文,
SUM(IF(课程='数学',分数,0)) AS 数学,
SUM(IF(课程='物理',分数,0)) AS 物理,
SUM(分数) AS 总分
FROM tb
GROUP BY 姓名 WITH ROLLUP ;


4. 动态,适用于列不确定情况,
 SET @EE='';
 SELECT @EE:=CONCAT(@EE,'SUM(IF(课程=\'',课程,'\'',',分数,0)) AS ',课程,',') FROM(SELECT DISTINCT 课程 FROM tb) A;
 SET @QQ=CONCAT('SELECT ifnull(姓名,\'合计\') 姓名,',@EE,' SUM(分数) AS 总分 FROM tb GROUP BY 姓名 WITH ROLLUP');
 PREPARE stmt2 FROM @QQ;
 EXECUTE stmt2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值