sql - 使用 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
解决方案
我认为这是一个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
推荐阅读
- javascript - Firebase Auth v9:Object(...) 不是函数
- javascript - 如何进行循环,返回字典对象 - 未定义 - jquery
- tensorflow - tf.random_normal_initializer 和 tf.keras.initializers.RandomNormal 的区别
- assembly - EMU 8086 在寄存器中存储错误的数组元素值
- c++ - Codelite 使用 libpqxx 连接示例和 g++ 在 macOS 上失败
- postgresql - timescaledb 将连续聚合提取为另一个超表
- arrays - 在 Verilog 中分配一个二维实数数组
- r - 我运行了一个包含 ggplot 函数的循环,但没有出现
- laravel - 消息:调用未定义的方法 Illuminate\Contracts\Validation\Rule::unique()
- mysql - MySql - 根用户无法运行任何命令