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

如何编写SQL查询校验存在负值的number_id、item_id组合必有正值

实现校验逻辑的SQL方案

方案1:分组聚合查询(最直观)

直接按number_id、item_id分组,统计是否存在负值和正值,过滤出存在负值但不存在正值的异常组合:

SELECT 
    number_id,
    item_id,
    CASE 
        WHEN SUM(CASE WHEN amount < 0 THEN 1 ELSE 0 END) > 0 
             AND SUM(CASE WHEN amount > 0 THEN 1 ELSE 0 END) = 0 
        THEN '异常:存在负值但无对应正值'
        ELSE '正常'
    END AS check_result
FROM TBL_A
GROUP BY number_id, item_id
-- 如果只需要看异常组合,打开下面的注释
-- HAVING SUM(CASE WHEN amount < 0 THEN 1 ELSE 0 END) > 0 
--    AND SUM(CASE WHEN amount > 0 THEN 1 ELSE 0 END) = 0

逻辑说明

  • 用SUM(CASE WHEN amount <0 THEN 1 ELSE 0 END)统计当前组合下负值的记录数,大于0说明存在负值
  • 用SUM(CASE WHEN amount >0 THEN 1 ELSE 0 END)统计当前组合下正值的记录数,等于0说明不存在正值
  • 两个条件同时满足就是不符合规则的异常组合

方案2:EXISTS关联查询

如果需要关联明细数据可以用这种写法,查询返回的所有结果都是不符合规则的异常组合,无返回结果说明所有组合都符合校验规则:

SELECT DISTINCT t1.number_id, t1.item_id
FROM TBL_A t1
WHERE t1.amount < 0
  AND NOT EXISTS (
    SELECT 1 
    FROM TBL_A t2 
    WHERE t2.number_id = t1.number_id 
      AND t2.item_id = t1.item_id 
      AND t2.amount > 0
)

测试数据运行结果

你提供的测试数据中所有带负值的number_id+item_id组合都存在对应正值,仅number_id=121200的组合只有正值属于正常情况,因此上述两个查询都不会返回异常记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:45:08