Jak wyświetlić rekord (wszystkie atrybuty tj. zawartość
wszystkich kolumn) z zestawu rekordów (czyli po prostu tabeli), który
charakteryzuje się/zawiera informację dotyczącą osobnika o najwyższym wzroście.
To takie zadanko da się rozwiązać podzapytaniem, ale
najprawdopodobniej wynikiem będzie jeden rekord i tyle (może być więcej, ale
tylko wtedy gdy więcej niż jeden osobnik ma ten sam najwyższy wzrost).
Jak wyświetlić wszystkie rekordy (wszystkie atrybuty tj.
zawartość wszystkich kolumn) z zestawu
rekordów (czyli po prostu z tabeli), które jest zestawieniem np. umów
leasingowych a warunki klasyfikacji/wyboru do zestawienia to: wartość
przedmiotu leasingu jest maksymalna i od
razu uwzględniamy rok zawarcia umowy (grupujemy po roku zawarcia umowy).
Podkreślam: od razu uwzględnić rok zawarcia umowy i by wynik
od razu jedną kwerenda dostać, a nie zapuszczać kilka kwerend zmieniając rok.
Patent najbardziej uniwersalny przedstawiam na przykładzie,
patent/pomysł zadziała i na MS SQL Serverze i na Oracle (na Oracle osobiście
lubię parę wartości i operator IN, ale to nie działa na serwerze firmy
Microsoftu).
Po kolei:
Najpierw wskazuję bazę, to poniższy zapis ustawi odpowiednią
bazę:
use zielony;
Podglądam tabelę, co w niej jest, jakie kolumny:
select top 10 * from kontrakt_start;
Klauzulę: top 10 należy używać, oczywiście może być top
20 etc. To otrzymamy próbkę w tym przypadku 10 rekordów tabeli. Nie należy do
podglądania pobierać całych tabel i dobry zwyczaj nakazuje jawnie pobierać
próbki, a nie zdawać się na „mądrość” używanego oprogramowania. Top nie
oznacza, maksymalnych wartości, to może zmylić, bo niby jakie kryterium?
Jak już widzimy to wiemy jakie mamy kolumny, to przechodzimy
do rzeczy, rozwiązanie jest następujące.
select
k.*
k.*
from
kontrakt_start k -- ta tabela ma alias k
, (select
max(wartosc_przedmiotu) max_wartosc
, year(data_umowy) rok_umowy
from kontrakt_start
max(wartosc_przedmiotu) max_wartosc
, year(data_umowy) rok_umowy
from kontrakt_start
group by year(data_umowy) ) m -- zapytanie
generujące tabelkę pośrednią o aliasie m
where
k.wartosc_przedmiotu = m.max_wartosc
and year(k.data_umowy) = m.rok_umowy;
where
k.wartosc_przedmiotu = m.max_wartosc
and year(k.data_umowy) = m.rok_umowy;
Czyli wyciągam dane z tabeli o aliasie „k” (czyli po prostu
z wykazu umów), komplet/wszystkie atrybuty (wartości w kolumnach) ale łączę z
drugą tabelą o aliasie „m”.
Tabela „m” to dwa pola zawierające maksymalną wartość
przedmiotu jako maks_wartosc pogrupowaną na rok , drugie pole to właśnie rok
umowy pozyskany funkcją YEAR z daty umowy.
I jak złączymy „k” i „m”, po klauzuli WHERE odpowiednimi
warunkami to tym zapytaniem od razu dostaniemy wykaz umów, wszystkie atrybuty,
z każdego roku, z maksymalną wartością w danym roku.
I jest zadanie, zmodyfikuj tak kwerendę, by uzyskać umowy z maksymalną wartością przedmiotu leasingu na tle grupy: marki (producenta przedmiotu leasingu).
PS. Patent, że tak powiem wypracowany
samodzielnie, ale też opisany w Roz. 15 książki „Antywzorce języka SQL” jako właściwe
rozwiązanie. Maczkiem o posiadaniu tej książki i jej czytaniu, bo powiem
otwarcie, ze 300 stron ma książka, a jak
jedną trzecią zrozumiem co autor napisał, to będzie dobrze. No nie ma co się
chwalić...
Brak komentarzy:
Prześlij komentarz