MySQL连接销售与支出表查询时sumexp、profit字段返回NULL如何解决
问题原因
- 你使用
LEFT JOIN以销售表的查询结果为左基准,若2021年11月的支出表没有对应数据,ex.sumexp就会返回NULL,NULL参与数值运算得到的结果也为NULL - 子查询中
GROUP BY month的逻辑存在错误:month是月份缩写(如Nov),会把不同年份的同月份数据合并统计,和你关联用的date_id(%m%Y格式,带年份)逻辑不匹配,也可能导致关联时找不到对应值 - 没有对NULL值做兼容处理,就算支出表当月确实没有数据,也应该把支出按0计算,才能得到正确的利润
修复后的查询代码
SELECT sl.month, sl.sumnet, IFNULL(ex.sumexp, 0) AS sumexp, (sl.sumnet - IFNULL(ex.sumexp, 0)) AS profit FROM (SELECT DATE_FORMAT(date,'%m%Y') AS date_id, DATE_FORMAT(date,'%b') AS month, YEAR(date) AS year, SUM(net_sales) AS sumnet FROM sales WHERE YEAR(date) = '2021' GROUP BY date_id, month, year) sl LEFT JOIN (SELECT DATE_FORMAT(date,'%m%Y') AS date_id, SUM(total) as sumexp FROM expense WHERE YEAR(date) = '2021' GROUP BY date_id) ex ON sl.date_id = ex.date_id ORDER BY sl.date_id ASC
改动说明
- 两个子查询都提前加了
YEAR(date) = '2021'的过滤条件,减少不必要的数据计算,避免其他年份数据干扰 - 修正了GROUP BY的逻辑:销售表子查询按
date_id(带年月的唯一标识)分组,确保每个月的统计数据都是2021年当月的,不会和其他年份同月份混淆 - 用
IFNULL(ex.sumexp, 0)把NULL的支出值替换为0,就算当月没有支出记录,也能正常计算利润 - 移除了子查询中冗余的字段,减少不必要的计算开销
内容的提问来源于stack exchange,提问作者Richelle
相关产品推荐
相关产品推荐

