【问题标题】:How to calculate sum of multi column with Case when condition in Oracle如何在Oracle中的条件下使用Case计算多列的总和
【发布时间】: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。最近人们太急于结束问题了。

标签: sql oracle oracle11g


【解决方案1】:

你还没有提供太多的例子。如果您想要一个严格的答案,您需要包含足够的示例数据以包含您想要的所有行为。

例如,为什么您的示例输入有两行,而您想要的结果只有一行?

拼命地试图在我认为的行之间阅读你想要的只是每行上的一个额外列,说明该行是否完全填满了它的框?

这只是一个使用MOD()CASE 表达式...

SELECT
     L55.PRODUCT_CODE 
   , L55.PRODUCT_NAME 
   , L55.TOTAL_QUANTITY
   , L55.PACKING_STYLE
   , L55.QUANTITY_IN_FULL_CTN
   , L55.SPAREBOX
   , CASE WHEN MOD(L55.TOTAL_QUANTITY, L55.PACKING_STYLE) = 0 THEN 0 ELSE 1 END   AS SPARE_QUANTITY
FROM
  LOG0104M L55

如果这不是您想要的,请添加 full 输入数据集和 full 集与该输入相对应的结果,正是您需要什么。

如果你不确定我的意思,请参考我之前给你的链接。

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2021-03-18
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多