【发布时间】:2021-07-31 22:47:24
【问题描述】:
我正在使用 oracle SQL 来计算我的数据库中某些列的值的总和,当我处于我的情况时
这是我的 LOG0104M 表,其中包含值:
PRODUCT_CODE PRODUCT_NAME PACKING_STYLE TOTAL_QUANTITY QUANTITY_IN_FULL_CTN SPAREBOX
3300099 AP-1516D 30 50 1 NULL
3330000 NEOSENSE 60 20 1 NULL
使用上面列的值,我想计算 'SPAREBOX' 的输出值为 0 或 1。要输出 'SPAREBOX' 的值为 0 或 1,它将基于 Spare_quantity 的结果,使用此配方:
1. FullBox = (Total_Quantity / Packing_Style)
2. Spare_quantity = Total_Quantity - FullBox * Packing_Style.
If Spare_quantity = 0 => SpareBox column = 0
If Spare_quantity > 0 => SpareBox column = 1.
示例:
1. 50 / 30 = FullBox (1,7)
2. 50 - 1.7 * 30 = Spare_quantity( 1,5)
=> Spare_quantity > 0 and then SpareBox column = 1
预期结果:
PRODUCT_CODE PRODUCT_NAME PACKING_STYLE TOTAL_QUANTITY QUANTITY_IN_FULL_CTN SPAREBOX
3300099 AP-1516D 30 50 1 1
这是我的查询:
WITH BOXCOUNT AS (
SELECT ROUND(SUM(TOTAL_QUANTITY/PACKING_STYLE)) AS FULLBOX FROM LOG0104M)
SELECT
L55.PRODUCT_CODE
, L55.PRODUCT_NAME
, L55.TOTAL_QUANTITY
, L55.PACKING_STYLE
, L55.QUANTITY_IN_FULL_CTN
, L55.SPAREBOX
, BC.FULLBOX
,CASE
WHEN SUM(L55.TOTAL_QUANTITY - BC.FULLBOX * L55.PACKING_STYLE) = 0 THEN L55.SPAREBOX = 0
WHEN SUM(L55.TOTAL_QUANTITY - BC.FULLBOX * L55.PACKING_STYLE) != 0 THEN L55.SPAREBOX = 1
END AS SPARE_QUANTITY
FROM LOG0104M L55, BOXCOUNT BC
GROUP BY
L55.PRODUCT_CODE
, L55.PRODUCT_NAME
, L55.TOTAL_QUANTITY
, L55.PACKING_STYLE
, L55.QUANTITY_IN_FULL_CTN
, BC.FULLBOX
, L55.SPAREBOX
它似乎以错误的结果运行,而不是预期的结果。
如何解决问题?非常感谢
【问题讨论】:
-
这不是你 3 小时前问的同一个问题吗? stackoverflow.com/questions/67469061/…
-
是的,和上一个问题一样,但我已经解释得更清楚了
-
另请注意,您的解释(尤其是数字示例)没有意义。 “满盒”不应该是整数,而不是小数吗?如果您允许它是小数,如您的示例中所示,则“备用箱”将始终为 0,通过微不足道的代数。在您的计算中它不是 0,只是因为您将 50/30 舍入为 1.7;目前尚不清楚你为什么这样做。相反,您似乎希望“完整的盒子”是一个整数,如果还有需要打包的物品,不需要 full 盒子,则需要设置“备用盒子”标志为 1;但你不是这样解释的。
-
如果事实上这是你的问题,你不需要除法,然后乘法,减法等。你只需要使用
mod()函数。 -
有时候我很绝望。 @GordonLinoff 要求 OP 提出一个新问题,因为寻址逻辑和语法存在本质上的不同,然后社区会因为这样做而击落 OP。最近人们太急于结束问题了。