我试图得到一些字段的总和,现在向上舍入到另一列中整数的下一个倍数。
一个例子是:这些选择列的总和是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
)
谢谢!
答案 0 :(得分:1)
如果我正确理解您的问题,您需要在查询中执行几个步骤
你已经有了第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而不是对多个表进行查询。在两个表上执行查询没有任何直接的错误...但在我看来,它使意图更具可读性。此外,它还可以提高查询性能。
我希望这会有所帮助。