如何使SQL查询同时展示已关闭与未关闭的收银台记录?
收银台数据查询解决方案
问题核心:原查询里的WHERE条件会过滤掉未关闭收银台的记录——一是未关闭收银台的close_date为NULL,导致BETWEEN条件不成立;二是LEFT JOIN后无对应账单的行,也会被WHERE里的i表字段条件过滤掉。
调整思路
把账单日期的关联逻辑从WHERE移到LEFT JOIN的ON子句里,同时针对两种收银台状态分别处理日期范围:
- 已关闭收银台:只统计开台到关台之间的账单
- 未关闭收银台:统计开台之后的所有账单(因为还没关台,没有结束日期)
最终SQL代码
SELECT ca.id AS cashier_id, ca.salesman, ca.open_date, ca.close_date, ca.status, ca.initial_balance, COALESCE(SUM(i.amount), 0) AS total_sales, ca.initial_balance + COALESCE(SUM(i.amount), 0) AS final_amount FROM tbl_cashier ca LEFT JOIN tbl_invoice i ON i.cashier_id = ca.id AND ( -- 已关闭收银台的账单范围 (ca.status != 0 AND i.payer_date BETWEEN ca.open_date AND ca.close_date) -- 未关闭收银台的账单范围 OR (ca.status = 0 AND i.payer_date >= ca.open_date) ) GROUP BY ca.id, ca.salesman, ca.open_date, ca.close_date, ca.status, ca.initial_balance;
关键细节说明
COALESCE(SUM(i.amount), 0):如果收银台没有对应账单,销售总额会显示为0,避免初始余额加NULL得到NULL的情况- 条件放在ON子句:保证LEFT JOIN能保留所有收银台记录,哪怕没有匹配的账单
- 分状态判断日期:精准适配已关闭和未关闭收银台的业务逻辑
内容的提问来源于stack exchange,提问作者J. Mick
相关产品推荐
相关产品推荐

