Расчет тарифа по счетам за электричество с использованием SQL - PullRequest
0 голосов
/ 30 марта 2020

У меня есть таблица «Показания» со следующей схемой:

----------------------------------------
|  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 ...

* 1008. *

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Я думаю, что это 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 
0 голосов
/ 31 марта 2020

Наконец, я решаю это следующим запросом

select sum(case when sum_value - end_value >= 0 then (end_value - start_value) * rate when sum_value - start_value >= 0 then (sum_value - start_value) * rate  else 0 end)
from (
        select sum(value) as sum_value, tariffs.rate as rate, tariffs.end_value as 
        end_value, tariffs.start_value as start_value
        from readings
        join
        tariffs
        on readings.id = tariffs.id
        group by rate, end_value, start_value
     ) 
...