执行求和时如何处理负值



假设我有下表。

|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 创建了一个采购订单 (po_num) 为物料 123、234 和 345。每个项目都有不同的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"就足够了,因为我有兴趣知道供应商是否没有交付订单,不一定被退回。我正在创建一个处理这两种情况的查询。任何帮助将不胜感激。

不太确定你在看什么,但这里有一个猜测。

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

最新更新