如何在执行总和时处理负值

时间:2017-07-14 20:59:09

标签: sql sql-server

我们假设我有下表。

|item_no | po_num | line_num | recv_qty | req_qty |
|--------|--------|----------|----------|---------|
|123     | 001    | 10       | 10       | 10      | 
|234     | 001    | 20       | 25       | 30      |
|345     | 001    | 30       | 80       | 80      |
|345     | 001    | 30       | -80      | 80      |
|567     | 002    | 10       | 40       | 10      |
|789     | 002    | 20       | 55       | 30      |
|987     | 002    | 30       | -70      | 70      |

在这种情况下,这代表的是,对于项目123,为项目123,234和345创建了一个采购订单(po_num)。每个项目都有不同的line_no。

在po_num = 001的情况下,line_num被返回给供应商,因此有两个条目,po_num = 001和line_num = 30,其中一个负rev_qty表示订单被返回。

还有一种情况,对于第987项,只有一个条目带有负的rev_qty,表示订单已被退回。

我需要的是一个能够给我recv_qty和req_qty之和的查询,这样我就能得到比率,看看供应商是否正确地履行了采购订单。我需要能够处理这两种情况。我相信在第二种情况下,如果我添加“where recv_qty> = 0”就足够了,因为我有兴趣知道提供商是否未交付订单,而不是必须返回。我正在创建一个处理这两种情况的查询。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

不确定你在看什么,但这是猜测。

declare @Something table
(
    item_no int
    , po_num char(3)
    , line_num int
    , recv_qty int
    , req_qty int
)

insert @Something
values
(123, '001', 10, 10, 10)
,(234, '001', 20, 25, 30)
,(345, '001', 30, 80, 80)
,(345, '001', 30, -80, 80)
,(567, '002', 10, 40, 10)
,(789, '002', 20, 55, 30)
,(987, '002', 30, -70, 70)

select item_no
    , po_num
    , sum(case when recv_qty > 0 then recv_qty else 0 end) as QuantitySold
    , sum(case when recv_qty < 0 then ABS(recv_qty) else 0 end) as QuantityReturned
from @Something
group by item_no
    , po_num