SUM和ROUND?基于与另一个领域的总和比较

时间:2014-10-23 18:26:58

标签: sql sum case rounding

我试图得到一些字段的总和,现在向上舍入到另一列中整数的下一个倍数。

一个例子是:这些选择列的总和是15.我要将它与之比较的列是13.我希望SUM然后向上舍入到26,因为它是13的下一个倍数涵盖SUM。对于每个项目,总和和比较列将是不同的,所以我希望找到一个可以根据Item / Loc进行计算的SQL。

我已经能够使SUM工作,但我不确定如何将此数字连接到比较字段/表,然后将其四舍五入。任何帮助都将非常感激,无论是如何从单独的表连接两个字段,或如何舍入到特定的倍数。要么让我更接近我的最终目标。

我当前的SQL看起来像

select s.Item,
       s.Loc, 
       p.MinDRPQty,
       p.IncDRPQty,
       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, p.IncDRPQty

MinDRPQty是我与SUM(NetNeed)

比较的数字

该部分适用于获取SUM。我假设我需要使用CASE或IF来使其工作,但我并不精通使用它们。

在Daileyo的帮助下,我已经接近了我正在寻找的东西。我现在的问题是,当使用多个表时,脚本不希望工作。我需要两个表来收集我的所有数据,这样做时会出错。

我修改过的脚本看起来像

SELECT 
   Item, Loc,
   orig as "NetNeed", 
   mult as "MinDRPQty", 
   (orig/mult) as "multiples_needed", 
   CASE 
      WHEN (orig/mult) <= 1 THEN mult  --always use next multiple if sum is < than multiplier
      ELSE CEIL(orig/mult)*mult --determine appropriate multiple, convert to int, and multiply
   END AS "ExpectedOrder"
 FROM
 (
     SELECT s.Item, s.Loc, SUM(s.OH + s.UDC_ActualIT + s.UDC_CommitIT - s.UDC_AllCustOrd - s.UDC_ADJ_AvgDailyDmd*(p.DRPCovDur/1440) - s.UDC_SafetyStock) as orig, p.MinDRPQty as mult  
     FROM  SKU s, group by s.Item, s.Loc
 )

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您需要在查询中执行几个步骤

  1. 总结一系列专栏
  2. 确定另一列中值的倍数
  3. 将返回的总和UP调整为第二步中有效倍数的下一个值。
  4. 你已经有了第1步,所以让我们继续第2步和第3步。

    假设您确实需要始终向上舍入到下一个倍数,那么首先检查您的case statement将处理您的总和是否大于或小于您要检查的列。如果它更小,那么您的结果将始终是该列乘以2。 你的其他人将处理多个需要使用的东西。

    我相信以下内容展示了您想要的实例。我正在使用Oracle的CEIL函数,它基本上只是舍入值Up,除非它是一个整数。

    如果您想使用小数,它会改变一些事情。此外,如果您实际上只想要汇总到下一个倍数,如果您的金额大于您的检查列...那么您将需要调整案例陈述的第一部分。

    此示例假设您使用的是Oracle。

     SELECT 
       orig as "summed_value", 
       mult as "multiplier", 
       (orig/mult) as "multiples_needed", 
       CASE 
          WHEN (orig/mult) <= 1 THEN mult*2  --always use next multiple if sum is < than multiplier
          ELSE CEIL(orig/mult)*mult --determine appropriate multiple, convert to int, and multiply
       END AS "result"
     FROM
     (
         SELECT SUM(1 + 5 + 2 +100) as orig, 17 as mult  FROM DUAL
     );
    

    <强>更新 根据其他信息,我要说最简单的事情是将现有查询视为inline view,然后从那里进行计算:

        SELECT 
         result_item
         ,result_location
         ,result_Min
         ,result_Inc
         ,result_NetNeed
         ,CASE 
            WHEN (result_NetNeed/resultMin) <= 1 THEN result_Min --use existing multiplier if  sum is less than multiplier
            ELSE CEIL(result_NetNeed/resultMin)*result_Min --determine appropriate multiple, convert to int, and multiply 
         END
         FROM
         (
           select 
           s.Item as result_item, 
           s.Loc as result_location, 
           p.MinDRPQty as result_Min, 
           p.IncDRPQty as result_Inc, 
           SUM (s.OH + s.UDC_ActualIT + s.UDC_CommitIT - s.UDC_AllCustOrd - s.UDC_ADJ_AvgDailyDmd*  (p.DRPCovDur/1440) - s.UDC_SafetyStock) as result_NetNeed 
           from SKU s, SKUPlanningParam p 
           where s.Item = p.Item and s.Loc = p.Loc group by s.Item, s.Loc, p.MinDRPQty, p.IncDRPQty
         );
    

    我无法测试SQL,所以如果有任何拼写错误,请原谅我......但逻辑应该大致正确。

    顺便说一下,我会考虑使用JOIN而不是对多个表进行查询。在两个表上执行查询没有任何直接的错误...但在我看来,它使意图更具可读性。此外,它还可以提高查询性能。

    我希望这会有所帮助。