首页 > 解决方案 > 使用 SQL 计算电费单价板

问题描述

我有具有以下架构的表“读数”:

----------------------------------------
|  Id  |        DateTime     |  value  |
---------------------------------------
|  16  |  01/01/19  22:50:59 |    90   | 
---------------------------------------
|  16  |  01/02/19  8:53:11  |    200  | 
---------------------------------------
|  16  |  04/01/19  22:50:59 |    400  |  
---------------------------------------
|  16  |  03/01/19  1:20:00  |    100  |
---------------------------------------

另一个表“关税”具有以下架构:

-------------------------------------------------
|  Id  |   start_value  | end_value |    rate   |
-------------------------------------------------
|  16  |        0       |    100    |    0.2    | 
-------------------------------------------------
|  16  |       100      |    500    |    0.25   | 
------------------------------------------------
|  16  |       500      |    1000   |    0.3    |   
-------------------------------------------------

我想在这里以总成本为例: 值的总和是 = 90 + 200 + 400 + 100 = 790 根据关税表,总和的前 100 将乘以 0.2 ,其他 400 乘以 0.25 。 ..

Then the cost = (100 * 0.2) + (400 * 0.25) + (290 * 0.3) = 207

标签: sqlpostgresqljoingroup-bysum

解决方案


我认为这是一个join和聚合:

select sum(value * rate)
from readings r join
     tariffs t
     on r.id = t.id and
        r.value >= t.start_value and
        r.value < t.end_value;

编辑:

我懂了。您需要根据总和进行此操作:

select sum(t.rate *
           greatest(least(sum_value, t.end_value) - greatest(sum_value, t.start_value), 0)
          )
from (select r.id, sum(value) as sum_value
      from readings r
     ) r join
     tariffs t
     on r.id = t.id 

推荐阅读