如何通过SQL Join查询含无订单商品的周转数据并显示0值
解决SQL左连接未显示主表无对应记录的问题
嘿,我来帮你搞定这个查询问题!你的现有代码有两个核心问题导致主表中没有订单的商品没被显示出来,咱们一步步修正:
问题分析
- 连接顺序错误:你把订单子查询作为左表,主表作为右表做左连接,这只会保留有订单记录的商品;应该反过来,用
mainproduct作为左表,左连接订单表,才能保留主表的所有商品。 - WHERE条件过滤了NULL记录:你在WHERE里加了
r.date_order的范围条件,而左连接后没有订单的商品对应的r.date_order是NULL,这些记录会被直接过滤掉,所以要把日期条件放到JOIN的ON子句里,而不是WHERE。 - SUM结果为NULL的处理:没有订单的商品,
SUM(pcs_order)会返回NULL,需要转成0才能符合你的期望结果。
修正后的SQL代码
SELECT mainproduct.id AS id_mainproduct, mainproduct.barcode, mainproduct.product_name, COALESCE(SUM(detail_order.pcs_order), 0) AS total_order_pcs FROM mainproduct LEFT JOIN detail_order ON mainproduct.barcode = detail_order.barcode AND detail_order.date_order BETWEEN '2018-02-01' AND '2018-02-28' GROUP BY mainproduct.id, mainproduct.barcode, mainproduct.product_name ORDER BY mainproduct.id ASC;
代码说明
- 左连接顺序:以
mainproduct为左表,确保所有商品都会出现在结果中,哪怕没有对应的订单记录。 - 日期条件放到ON子句:这样只会关联2018年2月的订单数据,同时不会过滤主表中无订单的商品。
- COALESCE函数:把SUM返回的NULL值替换成0,完美匹配你期望的
total_order_pcs为0的需求。 - GROUP BY完整性:包含所有非聚合字段,避免SQL模式(比如MySQL的
ONLY_FULL_GROUP_BY)下的语法错误。
执行这个查询后,就能得到你想要的结果:主表中所有商品都显示,无订单的商品total_order_pcs为0,其他商品的订单数量正确汇总。
内容的提问来源于stack exchange,提问作者Ifadak
相关产品推荐
相关产品推荐

