问题描述
我有一个项目表,其中包含 ID、产品、成本、数量和状态字段。我想要的是根据 ID 相同的产品数量的总和更新一个项目。
例如
ID Product cost quantity status
1 computer 100 10
1 tablet 200 10
2 ipad 50 15
现在,当供应商交付我想要的这些物品时,当相同 Id 的数量达到 0 时,状态必须更改为已接收,而不是应该说接收。
例如,如果供应商带来了 2 台电脑,数量将变为 8 台,ID 1 的状态将显示接收,如果供应商带来了 8 台电脑,状态仍应显示接收,因为平板电脑的未结余额为 10。但是当供应商带来了 10 片,ID 1 的数量均为 0,两者的状态都应显示已收到
ID Product cost quantity status
1 computer 100 0 Received
1 tablet 200 0 Received
2 ipad 50 15
我尝试过的是
UPDATE item
SET update_status = CASE
when sum (quantity) >0 THEN
'Receiving'
ELSE
'Received'
END
where approvalid =:p5_approvalid;
解决方法
我完全支持 mathguys 的评论。此外,请重新考虑您的命名选择。名为 ID
的表列最好是唯一的主键。
如果您仍想这样做,请使用 MERGE
:
merge into item
using (
select id,sum(quantity) as sum_quantity
from item
group by id
) u
on (item.id = u.id)
when matched then update
set status = case when sum_quantity > 0 then 'Receiving' else 'Received' end
using 子句将通过 ID
计算数量总和,这样就不需要在 set 子句中使用任何聚合函数。