Mysql 实现对查询结果进行 补0、补行 操作

问题描述

开发过程中有时候我们需要对一些数据进行进行补行处理,通过代码实现的方式我就不多说了,接下来我给大家展示一下通过sql的实现方式。

#准备表
CREATE TABLE `test_student_count` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `school_code` varchar(255) DEFAULT NULL,
  `course_type` varchar(255) DEFAULT NULL,
  `student_count` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
#数据准备
INSERT INTO `test`.`test_student_count`(`id`, `school_code`, `course_type`, `student_count`) VALUES (1, '001', '1', '10');
INSERT INTO `test`.`test_student_count`(`id`, `school_code`, `course_type`, `student_count`) VALUES (2, '001', '3', '21');
INSERT INTO `test`.`test_student_count`(`id`, `school_code`, `course_type`, `student_count`) VALUES (3, '002', '3', '16');

数据展示:
在这里插入图片描述


理想结果:
在这里插入图片描述
你的结果:
在这里插入图片描述
如果course_type没有对应的记录,那么这一行的数据都没有

解决思路

1.先模拟出来应有行数的数据表t1
2.用真实数据表t2对模拟表t1进行左关联
3.真实数据表t2有值的展示真实数据,没有的话补0
在这里插入图片描述

具体实现

SELECT
	basic.school_code,
	basic.course_type,
	IFNULL( tsc.student_count, 0 ) student_count 
FROM
	(
	SELECT
		* 
	FROM
		( SELECT school_code FROM test_student_count GROUP BY school_code ) t1
		CROSS JOIN ( SELECT 1 AS course_type, '物理' AS course_name UNION ALL SELECT 2, '化学' UNION ALL SELECT 3, '生物' ) t2 
	) basic
	LEFT JOIN 
	test_student_count tsc ON basic.school_code = tsc.school_code 
	AND basic.course_type = tsc.course_type 
ORDER BY
	basic.school_code,
	course_type;
	

执行结果:
在这里插入图片描述

参考文章

mysql 按时间分组,然后再补上缺少的日期并将数据置为0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值