根据范围应用和求和值

ohfgkhjo  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(251)

表信息:我必须根据使用sql查询的数量应用累进收费
交易量=49

Code |Serial num |Value_from|Value_To|Price
111  |1          |1         |20      |3
111  |2          |21        |40      |2
111  |3          |41        |9999    |1

前20笔交易-203
下一层:20
2
最后-91
总和(20
3,202,91)
如何使用sql实现这一点

2lpgd968

2lpgd9681#

大多数数据库支持 least() 以及 greatest() ,所以我将使用其中一个函数。用一个 case 表情。

select sum( (least(value_to, 49) - value_to + 1) * price ) as total_price
from t
where code = 111 and 49 >= value_from;

当然,你会替换 49 不管你的实际数量是多少。

toe95027

toe950272#

你已经知道你想要单独计算的总和。其中一个是202(2是价格)。现在,想想为什么它是202。是的,因为 value_to 40不大于49,所以考虑这个范围和20个结果 value_to - value_from + 1 .
为了校对:你要的是

(20 -  1 + 1) * 3   because 20 <= 49
(40 - 21 + 1) * 2   because 40 <= 49
(49 - 41 + 1) * 1   because 9999 > 49, but 41 <= 49

您需要对照给定的值(在您的例子中是49)检查范围,对于给定的值,您需要if/then构造。如果/那么是 CASE WHEN ... THEN 在sql中。

select
  sum
  (
    case
      when value_to <= given.value then (value_to - value_from + 1) * price
      when value_from <= given.value then (given.value - value_from + 1) * price
    end
  ) as total_price
from (select 49 as value) given
cross join ranges;

相关问题