求助:统计每月新客户SQL查询返回0结果问题排查
SQL排查与修正:统计当月新客户返回0的问题
原SQL的核心问题
- 子查询未关联主表:你的NOT EXISTS子查询没有和主查询的邮箱做关联,相当于只要数据库里存在任何一条早于2022-10-01的记录,NOT EXISTS就会判定为false,最终返回0。
- 表名语法错误:
.bc_order前面多了一个点,会导致数据库无法识别该表。 - 未限定统计月份:主查询没有筛选当前记录的订单是在2022年10月创建的,逻辑上没有锁定要统计的目标月份。
修正后的SQL
SELECT COUNT(DISTINCT b.email) FROM `bc_order_billing_addresses` b JOIN `bc_order` o ON o.order_id = b.order_id WHERE o.order_created_date_time BETWEEN '2022-10-01T00:00:00' AND '2022-10-31T23:59:59' AND NOT EXISTS ( SELECT 1 FROM `bc_order_billing_addresses` b_prev JOIN `bc_order` o_prev ON o_prev.order_id = b_prev.order_id WHERE b_prev.email = b.email AND o_prev.order_created_date_time < '2022-10-01T00:00:00' );
关键优化点
- 关联主表与子查询的邮箱:
b_prev.email = b.email确保我们检查的是同一个邮箱在当月之前是否有过订单记录。 - 限定目标月份:通过
BETWEEN筛选出2022年10月的订单,精准锁定要统计的新客户范围。 - 使用COUNT(DISTINCT):避免同一客户当月多次下单被重复计数。
- 替换LEFT JOIN为JOIN:我们只需要有对应订单的地址记录,LEFT JOIN会包含无效的无订单地址,这部分无需统计。
- 子查询用SELECT 1:相比SELECT email更高效,数据库只需判断存在性,无需返回具体字段值。
内容的提问来源于stack exchange,提问作者E. Reiner
相关产品推荐
相关产品推荐

