根据 Oracle SQL 中的前一行值计算行值

问题描述 投票:0回答:1

我无法确定最终降价。我有年数和每年的折扣。所以,我需要找出去年的最终价格是多少。如果我在一年内有折扣,那么我也需要在接下来的几年中获得折扣价,而不是原价。正如所附的屏幕截图所示,您可以看到在 2022 年和 2023 年我有 5% 的折扣,但这两年的结果是相同的,因为 5% 比原价减少了 5%,尽管在 2023 年必须减少 5% 2022 年已降价的 %。2024 年我有 0% 的折扣,所以我需要在 2024 年有 2023 年的价值。2025 年我有 2% 的折扣,所以应该从 2024 年的价值减少。这里是代码:

select k.object_number, k.plant, k.company, k.discount, k.demand, k.year, k.Price, 
      case when (k.discount) is null then k.price else k.price * (100-k.discount)/100 end as Reduced_price    
from K_TABLE as K
order by k.year`

实际结果示例:

Object Number     Plant      Company     Demand   Year     Discount   Price     Reduced Price
    1A                30          ABC         790      2021     0          45,88     45,88           1A                30          ABC         17587    2022     5          45,88     43,586       1A                21          ABC         7824     2022     5          45,88     43,586           1A                63          ABC         12038    2023     5          45,88     43,586         1A                30          ABC         21039    2023     5          45,88     43,586        1A                30          ABC         24299    2024     0          45,88     45,88         1A                37          ABC         17257    2024     0          45,88     45,88          1A                83          ABC         3060     2025     2          45,88     44,9624       1A                21          ABC         49647    2025     2          45,88     44,9624      1A                30          ABC         19904    2026     0          45,88     45,88                                       

请查看随附的屏幕截图以获取完整结果。`

enter image description here

sql dynamic oracle-sqldeveloper calculation
1个回答
0
投票

您可以使用算术计算总折扣——即对数和指数:

select k.*,
       (1 - exp(sum(ln(1 - discount / 100)) over (partition by object_number, plant, company order by year)
       ) as total_discount,
       (price *
        exp(sum(ln(1 - coalesce(discount, 0) / 100)) over (partition by object_number, plant, company order by year)
       ) as reduced_price
from K_TABLE as K
order by k.year;

exp(sum(ln( . . . )))
表达式正在做累积乘积。这不是内置于 SQL 中的,但它可以使用数学运算进行计算。

注意:很难说出数据中的“单位”是什么——也就是说,同一单位的“下”行是什么构成。我假设它是物体、工厂和公司的组合。但是,我希望有一个类似“产品”列的内容,其中的信息位于单个列中。

© www.soinside.com 2019 - 2024. All rights reserved.