使用CASE和SUM函数更新SQL

使用CASE和SUM函数更新SQL,sql,oracle,sum,case,Sql,Oracle,Sum,Case,我知道这似乎是一个类似的问题,以前也有人回答过,也许是这样。然而,我已经看完了答案,它们似乎都在表中起作用。它们似乎都不能在CASE函数中求和 在尝试创建更新脚本之前,我的脚本是 SELECT Item ,Loc ,MinDRPQty ,NetNeed ,CASE WHEN (NetNeed/MinDRPQty) <= 1 THEN MinDRPQty --use existing multiplier if sum is less than multiplier

我知道这似乎是一个类似的问题,以前也有人回答过,也许是这样。然而,我已经看完了答案,它们似乎都在表中起作用。它们似乎都不能在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。任何帮助都将不胜感激。如果以前有人回答过这个问题,而我错过了,我道歉

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
); 
这意味着结果可能是这样的

第1行:项目=1,loc=1,MinDRPQty=1,净需求=100500 第2行:项目=1,loc=1,MinDRPQty=2,净需求=500

假设表SKU中有一行项目=1,loc=1


进行上述更新时,存在一个问题:对于行item=1,loc=1,Oracle不知道哪个网络需要选择100500或500。这就是为什么我在找到的任何第一行中输入and ROWNUM=1。但我不确定这对你来说是否有意义。也许你需要一些额外的条件

是SKU。感谢添加了ROWNUM和nullif。这非常有效。@user2529787我已经更新了答案。你确定它能正常工作吗?您的问题中没有足够的信息,这就是为什么我将和ROWNUM=1放在一起,以显示整个ideaI没有您提到的任何多行,至少没有这个数据。但这对我来说是一个很好的工具,可以在将来使用。谢谢你的解释。非常有用。多同步-它确实像我希望的那样工作。非常感谢。
select 
    s.Item as Item, 
    s.Loc as Loc, 
    p.MinDRPQty as MinDRPQty,  
    SUM (...)
...
group by s.Item, s.Loc, p.MinDRPQty