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

Oracle SQL如何查询含负Qty的BillNo下所有明细记录

查询包含负qty的账单下所有明细记录

表结构与数据

table_a 

billno    desc        qty    amount
10324    orange       -1     -1.00
10324    apple         1      3.00
10324    papaya        1      2.00

10431    water melon   1      2.00
10431    kiwi          1      3.00   

10233    banana       -1     -2.50
10233    mango         1      4.00
..
.. 
total 378 records

需求

在未知billno的情况下,查询所有存在负qty的billno对应的desc、qty、amount字段的全部记录。

尝试过的方法及问题

曾使用sign(qty)筛选:

select desc,qty,amount from table_a where sign(qty)='-1';

返回结果仅包含负qty的单条记录:

orange       -1     -1.00
banana       -1     -2.50

但目标是获取对应账单下的所有明细:

orange       -1     -1.00
apple         1      3.00
papaya        1      2.00  

banana       -1     -2.50
mango         1      4.00

解决方案

方法1:子查询+IN

先筛选出所有存在负qty的billno,再匹配这些billno的全部记录:

SELECT `desc`, qty, amount
FROM table_a
WHERE billno IN (
    SELECT DISTINCT billno
    FROM table_a
    WHERE qty < 0
);

方法2:EXISTS子查询

通过关联子查询检查当前记录的billno是否存在负qty的条目:

SELECT t1.`desc`, t1.qty, t1.amount
FROM table_a t1
WHERE EXISTS (
    SELECT 1
    FROM table_a t2
    WHERE t2.billno = t1.billno
      AND t2.qty < 0
);

注:desc是SQL关键字,建议用反引号包裹避免语法错误。

方法3:窗口函数(适用于支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL等)

按billno分组,标记该组是否存在负qty,再筛选出标记为存在的记录:

SELECT `desc`, qty, amount
FROM (
    SELECT 
        `desc`, qty, amount,
        MAX(CASE WHEN qty < 0 THEN 1 ELSE 0 END) OVER (PARTITION BY billno) AS has_neg_qty
    FROM table_a
) AS sub
WHERE has_neg_qty = 1;

内容的提问来源于stack exchange,提问作者Hoong wai kong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:35