我知道这似乎是一个类似的问题,之前已经回答过,而且可能是。但是,我已经查看了答案,他们似乎都沿着table.x = sum(case when(x)))示例。它们似乎都无法在CASE函数中获得总和。
在尝试创建更新脚本之前,我的脚本是
SELECT
Item
,Loc
,MinDRPQty
,NetNeed
,CASE
WHEN (NetNeed/MinDRPQty) <= 1 THEN MinDRPQty --use existing multiplier if sum is less than multiplier
ELSE CEIL(NetNeed/MinDRPQty)*MinDRPQty --determine appropriate multiple, convert to int, and multiply
END as "ExpectedOrder"
FROM
(
select
s.Item as Item,
s.Loc as Loc,
p.MinDRPQty as MinDRPQty,
SUM (s.OH + s.UDC_ActualIT + s.UDC_CommitIT - s.UDC_AllCustOrd - s.UDC_ADJ_AvgDailyDmd* (p.DRPCovDur/1440) - s.UDC_SafetyStock) as NetNeed
from SKU s, SKUPlanningParam p
where s.Item = p.Item and s.Loc = p.Loc group by s.Item, s.Loc, p.MinDRPQty
)
我希望更新名为UDC_NetNeed的字段。所以我需要从这个声明中获得NetNeed。任何帮助将不胜感激。如果之前已经回答过,而我错过了,我道歉。
答案 0 :(得分:1)
update SKU s
set UDC_NetNeed = (
SELECT
CASE
WHEN (NetNeed/nullif(MinDRPQty, 0)) <= 1 THEN MinDRPQty --use existing multiplier if sum is less than multiplier
ELSE CEIL(NetNeed/nullif(MinDRPQty, 0))*MinDRPQty --determine appropriate multiple, convert to int, and multiply
END
FROM
(
select
s.Item as Item,
s.Loc as Loc,
p.MinDRPQty as MinDRPQty,
SUM (s.OH + s.UDC_ActualIT + s.UDC_CommitIT - s.UDC_AllCustOrd - s.UDC_ADJ_AvgDailyDmd* (p.DRPCovDur/1440) - s.UDC_SafetyStock) as NetNeed
from SKU s, SKUPlanningParam p
where s.Item = p.Item and s.Loc = p.Loc group by s.Item, s.Loc, p.MinDRPQty
) a where a.Item = s.Item and a.Loc = s.Loc and ROWNUM = 1
);
目前还不清楚你要更新什么,我想这是SKU表
“和ROWNUM = 1”这个条件不清楚并添加,以防止相关子查询中的多个结果。
一些信息
select
s.Item as Item,
s.Loc as Loc,
p.MinDRPQty as MinDRPQty,
SUM (...)
...
group by s.Item, s.Loc, p.MinDRPQty
这意味着结果可能是这样的
第1行:item = 1,loc = 1,MinDRPQty = 1,netNeed = 100500
第2行:item = 1,loc = 1,MinDRPQty = 2,netNeed = 500
假设表SKU中有一行item = 1,loc = 1。
当您进行上述更新时出现问题:对于行“item = 1,loc = 1”,Oracle不知道选择哪个netNeed(100500或500)。这就是为什么我把“和ROWNUM = 1”(找到的任何第一行)。但我不确定你的情况是否合理。也许你需要一些额外的条件!