如何用MySQL关联两张表查询客户未完全结清订单详情?
查询指定客户未完全结清订单的SQL方案
需求拆解
要获取客户ID为50的所有未结清订单,需满足:
- 包含无支付记录的订单
- 计算未结金额(订单总金额 - 已支付的有效金额)
- 输出字段:
order_id、order_total、client_id、outstanding
最终SQL语句
SELECT o.order_id, o.order_total, o.client_id, o.order_total - COALESCE(SUM(CASE WHEN op.payment_status = 'paid' THEN op.payment_amount ELSE 0 END), 0) AS outstanding FROM orders o LEFT JOIN order_payments op ON o.order_id = op.order_id WHERE o.client_id = 50 GROUP BY o.order_id, o.order_total, o.client_id HAVING o.order_total - COALESCE(SUM(CASE WHEN op.payment_status = 'paid' THEN op.payment_amount ELSE 0 END), 0) > 0;
语句说明
- LEFT JOIN:确保即使订单没有支付记录(无匹配的
order_payments行),也能被纳入结果,符合“无支付记录视为未结清”的要求。 - CASE + SUM:只统计支付状态为
paid的金额,忽略open状态的未完成支付。 - COALESCE:处理无支付记录的场景,将
SUM返回的NULL转为0,避免计算时出现NULL值。 - GROUP BY:按订单维度聚合,确保每个订单只返回一行结果。
- HAVING:过滤掉已完全结清(未结金额为0)的订单,只保留未结清的记录。
这段语句适配MySQL、PostgreSQL等主流关系型数据库,无需额外修改即可运行。
内容的提问来源于stack exchange,提问作者Valbuena
相关产品推荐
相关产品推荐

