You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:40:13