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

如何筛选仅使用Cash支付的Order_id?SQL查询问题求助

解决仅筛选使用Cash支付的订单ID问题

你的问题出在原SQL的逻辑上:WHERE (payment_type = 'Cash' and payment_type <> 'Check')只是筛选出当前行是Cash的记录,但订单3346里存在Cash类型的行,所以这些行会被返回,导致订单ID 3346出现在结果里——但实际上这个订单还有Check支付,不符合你的需求。

下面是几种正确的查询方法:

方法1:使用GROUP BY + HAVING(最直观的方式)

通过分组统计每个订单的支付类型,确保只有一种支付方式且为Cash:

SELECT order_id
FROM orders
GROUP BY order_id
HAVING COUNT(DISTINCT payment_type) = 1 
   AND MAX(payment_type) = 'Cash';
  • COUNT(DISTINCT payment_type) = 1:确保该订单只有唯一一种支付方式
  • MAX(payment_type) = 'Cash':因为只有一种支付方式,MAX/MIN都能拿到这个值,确认是Cash

方法2:使用NOT EXISTS(性能友好的方式)

先找到所有有Cash支付的订单,再排除掉那些存在其他支付方式的订单:

SELECT DISTINCT o.order_id
FROM orders o
WHERE o.payment_type = 'Cash'
  AND NOT EXISTS (
    SELECT 1 
    FROM orders o2 
    WHERE o2.order_id = o.order_id 
      AND o2.payment_type != 'Cash'
);
  • NOT EXISTS子查询会检查同一个订单是否存在非Cash的支付记录,如果存在就排除该订单
  • DISTINCT用来去重,因为一个订单可能有多个Cash商品行

方法3:使用EXCEPT(语法简洁,需数据库支持)

如果你的数据库支持EXCEPT(比如PostgreSQL、SQL Server),可以用集合差集实现:

SELECT order_id FROM orders WHERE payment_type = 'Cash'
EXCEPT
SELECT order_id FROM orders WHERE payment_type != 'Cash';
  • 先获取所有有Cash支付的订单ID,再减去有非Cash支付的订单ID,剩下的就是仅用Cash的订单

内容的提问来源于stack exchange,提问作者Radhika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:04:32