根据总和值更新记录

问题描述

我有一个项目表,其中包含 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 子句中使用任何聚合函数。