Obliczanie kwot na podstawie dwóch tablic

Obliczanie kwot na podstawie dwóch tablic
XT
  • Rejestracja: dni
  • Ostatnio: dni
0

Są dwie tablice:

Stawki

Kopiuj
Id            tytul      od                     cenaj
1             tytul1    2013-01-01         0,10
2             tytul1    2014-01-01         0,20
3             tytul1    2015-01-01         0,30

Oplaty

Kopiuj
Id            tytul      stawka  od                     do                      ilość
1             tytula    tytul1    2014-02-01         2015-03-01         10

Pożądany efekt końcowy zapytania byłby taki:

Kopiuj
+--------+-----------------+-----------------+--------+
| tytula   | 2014-02-01        | 2015-01-01       |2,00      |
+--------+-----------------+-----------------+--------+
| tytula   | 2015-01-01        | 2015-03-01       |3,00      |
+--------+-----------------+-----------------+--------+

Jak takie zapytanie skomponować (Baza jest lokalna SQLITE, więc wchodzą w grę JOIN i LEFT OUTER JOIN ale nie RIGHT OUTER JOIN ani nie FULL JOIN)

Z góry dziękuję za odpowiedź

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
0

Póki możesz zmien tabele STAWKI dodając kolumnę DO. Zobaczysz ile problemów to uprości.

XT
  • Rejestracja: dni
  • Ostatnio: dni
0

Wiem :)
Oprogramowałem już moduł edycji stawek, gdy jeszcze nie miałem do końca przemyślanej mechaniki naliczania kwot. Teraz się zarzynam z tym od pewnego czasu. Ale chyba w końcu będę przebudowywał. Chyba, że ktoś zna sposób, jak wyciągnąć takie dane bez ingerencji w kod programu i strukturę tablic?

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
1

Jeśli możesz zmodyfikować tak tabelę, jak napisałem wcześniej, to tak zrób. Jeśli nie, to możesz utworzyć sobie view:

Kopiuj
CREATE VIEW v_stawki as select "id", "tytul", "od", Coalesce((SELECT Min(date("od",'-1 day')) FROM stawki WHERE "od">s."od"), '2020-12-31') as "do", "cenaj" from stawki as s

A potem to już prosto...

Kopiuj
select o.tytul, max(o.od,s.od) od, min(o.do, s.do) do, s.cenaj from oplaty o join v_stawki s on o.od<=s.do and o.do>s.od

A jak nie możesz utworzyć nawet view, to:

Kopiuj
select o.tytul, max(o.od,s.od) od, min(o.do, s.do) do, s.cenaj from oplaty o join (select "id", "tytul", "od", Coalesce((SELECT Min(date("od",'-1 day')) FROM stawki WHERE "od">s."od"), '2020-12-31') as "do", "cenaj" from stawki as s) s on o.od<=s.do and o.do>s.od

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.