按月份分组查询仅返回4月数据,SQL语句排查求助
首先,先给你一个能正确返回所有月份统计结果的SQL语句(顺便提一句:我核对了你的数据,4月的实际总和应该是 2*20 + 3*10 + 8*4 +10*4 = 40+30+32+40=142,和你给出的预期92有出入,可能是你数据或预期结果笔误,但先聚焦解决你的问题):
SELECT MONTH(o.processedon) AS month, -- 用COALESCE处理没有对应items的月份,返回0而非NULL SUM(COALESCE(i.quantity * i.unitprice, 0)) AS total_value FROM operations o -- 左连接确保所有operation的月份都被保留,哪怕没有对应items LEFT JOIN items i ON o.id = i.operation_id GROUP BY MONTH(o.processedon) ORDER BY month;
接下来分析你的查询只返回4月数据的几种常见原因,你可以对照自己的SQL逐一排查:
1. 误用INNER JOIN且额外过滤了数据
如果你的查询用了INNER JOIN(或者旧版的逗号分隔表+WHERE关联的写法),那么只有同时在两张表存在匹配记录的行才会被保留。但按你的数据,1月、4月、5月都有对应items,应该返回这三个月的数据,除非你额外加了WHERE条件过滤掉了1月和5月,比如不小心加了WHERE o.processedon BETWEEN '2018-04-01' AND '2018-04-30',这会直接只保留4月的数据。
2. GROUP BY子句写法错误
比如你没有按MONTH(o.processedon)分组,而是按了i.operation_id,这时候会按每个操作ID单独统计,而4月有两个操作ID(3和4),如果你的查询工具自动合并了相同月份的结果,可能只会显示4月的总和?或者你在GROUP BY里写的字段和SELECT里的月份字段不一致,比如GROUP BY o.processedon(按完整日期分组),这时候每个日期一行,只有4月有多个日期,可能被你误以为只返回4月。
3. 日期提取函数用错了表字段
你的SQL开头是SELECT month(operations....,如果不小心把operations.processedon写成了items表的某个日期字段(而items表的日期字段只有4月的数据),那自然只会返回4月的统计结果。
4. 未处理NULL值导致部分月份被隐藏
如果某个月份没有对应items记录,SUM(i.quantity * i.unitprice)会返回NULL,如果你的查询工具默认隐藏NULL值的行,那3月会被隐藏,但1月和5月应该还是会显示,所以这种情况不太可能只返回4月,但可以用COALESCE把NULL转为0来避免。
现在你可以对照自己的SQL语句检查以上几点,大概率是WHERE条件误过滤、GROUP BY写法错误或者连接类型不对导致的问题。
内容的提问来源于stack exchange,提问作者Nie Selam

