Cześć Marcinie,
Samozłączenie… Tym razem popracujemy na jednej tabeli, to
nie pomyłka :-)
Przykładowy zestaw danych prezentuje rysunek, mamy tabelę
ROZLICZENIA, tabela to trzy pola, DATA_STANU, KONTRAKT, SALDO. Do tej
tabeli na koniec roku zapisujemy dane o aktualnych
stanach rozliczeń dla poszczególnych kontraktów, ale tylko kontrakty, które nie
są kompletnie spłacone. Uwaga, tu jest kluczowy haczyk, który będzie miał
istotne znaczenie dla zadania. Nie ma w danej dacie stanu kontraktu jeszcze
niezawartego (oczywiste :-))
ale też już kompletnie rozliczonego.
I teraz Marcinku (po raz pierwszy tak zdrobniale) zadanie, jakie kwoty spłat uzyskaliśmy dla kontraktów, które były do rozliczenia na koniec roku 2010 ich stanem na koniec roku 2012. Po prostu oblicz kwotę spłat kontraktów z końca 2010 przez dwa kolejne lata, do stanu na koniec 2012.
Rozwiązanie w EXCEL prezentuję na tym samym obrazku, zwróć
uwagę, iż zastosowałem dwie fajne funkcjonalności wbudowane w EXCEL. Po
pierwsze zastosowałem wyszukaj.pionowo,
po drugie jeżeli.błąd. Tę drugą
funkcjonalność EXCELA wykorzystuję, ponieważ w dacie 31 grudnia 2012 nie ma już
całkowicie rozliczonych kontraktów, dla których saldo w dacie 31 grudnia 2010
nie było zerowe. Zastosowanie jeżeli.błąd powoduje, iż zamiast komunikatu błędu #N/D! ,
który niechybnie się pojawia jeżeli zastosuję tylko wyszukaj.pionowo mam zera.
I to już w zasadzie koniec w EXCEL, różnicę obliczam i mam spłaty.
A przy pomocy SQL?
By nie było łatwo tabelka ROZLICZENIA ma trzy stany. Marcin,
w pierwszej kolejności jednak kwestia samozłączenia. Po prostu chodzi o to, iż
można złączenia napisać pracując cały czas na jednej tabeli (jak w tym
przykładzie) i wykorzystać trik z aliasami. Innymi słowy nadać danej i tej
samej tabeli jeden alias, następnie tej samej tabeli drugi alias. W ten sposób
sztucznie widzisz jakby dwie tabele i już, masz samozłączenie :-)
W przykładowym zadaniu masz jednak trzy stany, musisz zapisać
które stany Ciebie interesują. Haczyk
polega na tym, iż samozłączenie wyjdzie Ci jako „wewnętrzne”, w odpowiedzi na
Twoje zapytanie dostaniesz tylko te wiersze, dla których nastąpiło złączenie.
Marcinie, a Ty wiesz, iż w stanie końca roku 2012 nie ma rozliczonych umów, w
EXCELU musiałeś to sprytnie ominąć. Samozłączenie gubi rozliczone umowy :-(
Nieważne jak będziesz plusikami próbował dociągnąć, czy też zastosujesz notację
z JOIN.
Co z tym zrobić? Spróbuj sam Marcinie :-) a
jak już się zmęczysz (liczę, iż spróbujesz jednak sam) zajrzyj do
opublikowanego rozwiązania.
Materiały: