Przygotujcie stare gazety, klej, papier, mazaki i nożyczki.
Czasem trzeba wykazać coś, czego nie było. Przykład? Lekarz wykonał w miesiącu kilkanaście porad. Jak pokazać syntetyczne to wykonanie na planie miesiąca? Tak, żeby było widać wszystkie dni, również te, w których nie pracował.
Najprościej wziąć jakąś tabelę. Intuicja mi podpowiada, że to powinna być słabo przyrastająca tabela. Nie znam się na tym na tyle, żeby wam wyjaśnić fachowo, dlaczego. Roboczo nazwę ją stare_gazety. Jeśli macie w swojej bazie tabelę o takiej nazwie, nic już nie musicie zmieniać! Oto jedno z niewielu rozsądnych zastosowań ROWNUM. Potrzebna nam konkretna ilość wierszy. Zaczynajmy.
Mamy jakąś datę? Weźmy dzisiejszą.
select sysdate dt from dual
Miesiąc, w którym siedzi ta data zaczyna się datą pole1 i ma dni pole2:
with d as (select sysdate dt from dual) select trunc(d.dt,'mm') pole1 , to_char(LAST_DAY(d.dt),'dd') pole2 from d
Teraz bierzemy stare gazety i nożyczki i z tego robimy sobie takie coś:
with d as (select sysdate dt from dual) select rownum, to_char(trunc(d.dt,'mm') + rownum -1,'yyyy-mm-dd') data, to_char(trunc(d.dt,'mm') + rownum -1,'Day') dzien from stare_gazety tb join d on 1=1 where rownum <=to_char(LAST_DAY(d.dt),'dd')
Wynik jest oszałamiający:
ROWNUM | DATA | DZIEN |
1 | 2019-10-01 | Wtorek |
2 | 2019-10-02 | Środa |
3 | 2019-10-03 | Czwartek |
4 | 2019-10-04 | Piątek |
5 | 2019-10-05 | Sobota |
6 | 2019-10-06 | Niedziela |
7 | 2019-10-07 | Poniedziałek |
8 | 2019-10-08 | Wtorek |
9 | 2019-10-09 | Środa |
10 | 2019-10-10 | Czwartek |
11 | 2019-10-11 | Piątek |
12 | 2019-10-12 | Sobota |
13 | 2019-10-13 | Niedziela |
14 | 2019-10-14 | Poniedziałek |
15 | 2019-10-15 | Wtorek |
16 | 2019-10-16 | Środa |
17 | 2019-10-17 | Czwartek |
18 | 2019-10-18 | Piątek |
19 | 2019-10-19 | Sobota |
20 | 2019-10-20 | Niedziela |
21 | 2019-10-21 | Poniedziałek |
22 | 2019-10-22 | Wtorek |
23 | 2019-10-23 | Środa |
24 | 2019-10-24 | Czwartek |
25 | 2019-10-25 | Piątek |
26 | 2019-10-26 | Sobota |
27 | 2019-10-27 | Niedziela |
28 | 2019-10-28 | Poniedziałek |
29 | 2019-10-29 | Wtorek |
30 | 2019-10-30 | Środa |
31 | 2019-10-31 | Czwartek |
Tyle dni, a tylko cztery poniedziałki…
Teraz można wyświetlić dni pracy lekarza za pomocą złączenia jego tabeli praca z poprzednim zapytaniem SQL, nazywając je np. kalendarzem:
select kalendarz.data, count(praca.id) from kalendarz left join praca on kalendarz.data = praca.data group by kalendarz.data
Złączenie left join spowoduje, że zostaną wstawione do wyniku wszystkie dni z kalendarza i liczba porad lekarza w danym dniu. Banalne, prawda? Ale dopiero po opisaniu tego, umiem to w końcu zrobić.
A tu macie gotowy, jeśli nie chce wam się dłubać w SQL:
