【问题标题】:SUM and ROUND? based on sum comparison to another field求和和取整?基于与另一个字段的总和比较
【发布时间】:2014-10-23 18:26:58
【问题描述】:

我正在尝试获取几个字段的总和,以便现在四舍五入到另一列中整数的下一个倍数。

一个例子是:这些选择列的总和是 15。我想要比较的列是 13。我希望 SUM 然后向上舍入到 26,因为它是 13 的下一个倍数涵盖总和。每个Item的总和和比较列都会不同,所以我希望找到一个可以根据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) 比较的数字

这部分工作,在获得总和。我认为我需要使用 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
 )

谢谢!

【问题讨论】:

    标签: sql sum case rounding


    【解决方案1】:

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

    1. 总结一系列专栏
    2. 确定另一列中值的倍数
    3. 将返回的总和调整为第二步中有效倍数的下一个值。

    您已经完成了第 1 步,让我们继续第 2 步和第 3 步吧。

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

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

    如果您想使用小数,它会稍微改变一下。此外,如果您实际上只想在总和大于检查列的情况下向上舍入到下一个倍数...那么您将需要调整 case 语句的第一部分。

    此示例假设您使用的是 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 而不是对多个表进行查询。对两个表进行查询并没有直接的错误……但在我看来,它使意图更具可读性。它还可以提高查询性能。

    我希望这会有所帮助。

    【讨论】:

    • 帮助很大。但是,当我尝试添加表名和列名时,我遇到了麻烦,特别是因为我使用两个不同的表来收集我的所有数据。只需使用一张桌子,您的示例就可以完美运行。但是在使用这两个表时都会出错。
    • 在不知道一些额外信息的情况下很难帮助修改。您是否已经在现有查询中获得了比较值(即,您现有的查询返回 s.Item、s.Loc 和 NetNeeded……这些是您的比较值吗?)如果没有,您能否将该值作为一部分你的结果集有 JOIN 还是什么?如果您可以将比较值作为现有查询的一部分......那么您应该能够将现有查询视为内联视图,然后在内联视图上进行乘数案例工作。
    • 我现有的查询确实获得了比较值。不是我发布的那个,但我确实有一个确实获得了该值。MinDRPQty 是我与 SUM (NetNeed) 进行比较的值。
    • 选择 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) 作为来自 SKU s、SKUPlanningParam p 的 NetNeed,其中 s.Item = p.Item 和 s.Loc = p.Loc 按 s.Item、s.Loc、p.MinDRPQty、p.IncDRPQty 分组
    • 非常感谢您在这方面的帮助。它工作得很好,看起来比我的好多了。我也很欣赏关于 JOIN 的建议。那将是我的下一个学习。
    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多