使用CASE和SUM函数更新SQL

时间:2014-10-24 13:15:33

标签: sql oracle sum case

我知道这似乎是一个类似的问题,之前已经回答过,而且可能是。但是,我已经查看了答案,他们似乎都沿着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。任何帮助将不胜感激。如果之前已经回答过,而我错过了,我道歉。

1 个答案:

答案 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”(找到的任何第一行)。但我不确定你的情况是否合理。也许你需要一些额外的条件!