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

如何编写SQL查询筛选所有关联方状态均为COMP的订单

解决方案:筛选所有关联方状态均为COMP的订单

我来帮你解决这个问题,针对你的数据集需求,这里有几种高效的SQL实现方式,都能精准筛选出所有关联方状态全为COMP的订单(只要订单存在任意NOTCOMP状态就排除):

问题回顾

你提供的数据集如下:

OrderPartyParty Status
1P1COMP
1P2NOTCOMP
2P3COMP
2P1COMP
1P3NOTCOMP
3P6COMP

预期结果是仅返回订单2和3。


解法1:GROUP BY + HAVING(最直观的分组筛选)

这种方法通过按订单分组,检查分组内是否存在NOTCOMP状态的记录:

SELECT "Order"
FROM your_subquery -- 替换为你的子查询或实际表名
GROUP BY "Order"
HAVING COUNT(CASE WHEN "Party Status" = 'NOTCOMP' THEN 1 END) = 0;

原理:CASE语句会为每个NOTCOMP的记录标记1,其他为NULL;COUNT()只统计非NULL值,当结果为0时说明该订单没有任何NOTCOMP的关联方。

你也可以用更简洁的写法,利用MAX()函数判断是否存在无效状态:

SELECT "Order"
FROM your_subquery
GROUP BY "Order"
HAVING MAX(CASE WHEN "Party Status" != 'COMP' THEN 1 ELSE 0 END) = 0;

解法2:NOT EXISTS 子查询(适用于大表的高效查询)

通过子查询找出所有包含NOTCOMP状态的订单,然后在主查询中排除这些订单:

SELECT DISTINCT "Order"
FROM your_subquery t1
WHERE NOT EXISTS (
    SELECT 1
    FROM your_subquery t2
    WHERE t2."Order" = t1."Order"
      AND t2."Party Status" = 'NOTCOMP'
);

原理:NOT EXISTS会检查是否存在满足条件的子记录,当不存在时就保留当前订单;DISTINCT确保每个订单只返回一次。


解法3:窗口函数(需要保留关联方详情时使用)

如果需要返回订单的所有关联方信息,同时确保该订单没有NOTCOMP状态,可以用窗口函数标记每个订单的状态:

WITH order_status_summary AS (
    SELECT 
        *,
        -- 为每个订单标记是否存在NOTCOMP状态
        MAX(CASE WHEN "Party Status" = 'NOTCOMP' THEN 1 ELSE 0 END) 
        OVER (PARTITION BY "Order") AS has_invalid_party
    FROM your_subquery
)
SELECT "Order", Party, "Party Status"
FROM order_status_summary
WHERE has_invalid_party = 0;

这种方法会返回订单2和3的所有关联行,而不仅仅是订单号。


结果验证

以上所有查询都会得到你预期的结果:

Order
2
3

如果使用解法3,会返回更详细的信息:

OrderPartyParty Status
2P3COMP
2P1COMP
3P6COMP

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:23:16