[mssql]Funkcje agregujace
Grzechu - 02-01-2006 12:07
[mssql]Funkcje agregujace
Witam, zanim wystrzela szampany i wygeneruja potrzebe leczenia odwodnienia, kacem zwana, chcialbym zapytac sie Was, czy ktokolwiek tanczyl juz pogo ze wspomnianymi w temacie funkcjami agregujacymi. O co chodzi?: otoz mam 3 tabele: a(1->N)b(1->N)c, niech a-rodzina, b-czlonkowie_rodzin, c-wplywy. Interesuje mnie wyciagniecie w kwerendzie najmniejszych oraz najwiekszych wplywow pod rodzine. Wynik ma dac cos w rodzaju: rodzina:"kiepscy" "minimalny wplyw"(np:ferdynand'a.kiepski'ego):wplyw "maksymalny wplyw"(np:nieferdynand.kiepski/a):wplyw, rodzina:"niekiepscy" "minimalny wplyw"(np:ferdynand.niekiepski):wplyw "maksymalny wplyw"(np:ferdynand.niekiepski):wplyw. Czy bez uzycia widokow lub jakichs tajemnych mocy Jedi da sie to "ergnomicznie" zrobic.? Z gory dziekuje za poswiecenie mi chwilki swego istnienia, a zarazem zycze szampanskiej zabawy! Wszystkiego dobrego!
-- Pozdrawiam noworocznie Grzechu
Bartek Dajewski - 03-01-2006 10:29
Czesc.
Uzytkownik "Grzechu" <vas@magma-net.pl> napisal w wiadomosci [...] > otoz mam 3 tabele: a(1->N)b(1->N)c, niech a-rodzina, > b-czlonkowie_rodzin, c-wplywy. Interesuje mnie wyciagniecie w kwerendzie > najmniejszych oraz najwiekszych wplywow pod rodzine. Wynik ma dac cos w > rodzaju: rodzina:"kiepscy" "minimalny > wplyw"(np:ferdynand'a.kiepski'ego):wplyw > "maksymalny wplyw"(np:nieferdynand.kiepski/a):wplyw, > rodzina:"niekiepscy" "minimalny wplyw"(np:ferdynand.niekiepski):wplyw > "maksymalny wplyw"(np:ferdynand.niekiepski):wplyw. > Czy bez uzycia widokow lub jakichs tajemnych mocy Jedi da sie to > "ergnomicznie" zrobic.?
Da się i bez magii i widoków. Trzeba tylko zastanowić się co się chce od serwera dowiedzieć. Zauważ, ze minimalny czy maksymalny wplyw w rodzinie: select max(wplyw), min(wplyw), nazwisko from... group by nazwisko to jest jedno zagadnienie, a już do którego członka rodziny ten wpływ należy to zupełnie inna rzecz. Dlaczego inna? A dlatego, ze taki sam - minimalny (lub maksymalny) wpływ mogła uzyskać w danej rodzinie więcej niż jedna osoba. Trzeba więc zdecydować co zrobić z nazwiskami osób, jeśli jest ich więcej w jednej rodzinie. Przykładowo dla minimalnego wpływu: select nazwisko, imie, min(wplyw) from ...join ... group by nazwisko, imie having min(wplyw) = (select min(wplyw) from rodzina r where r.nazwisko = rodzina.nazwisko) -- (zakładam, że [nazwisko] jest w tabeli [rodzina], [imie] w [czlonkowie], a [wplyw] we [wplywy]. Dla uproszczenia zapisu pominąłem klucze własne i obce)
zwróci wszystkich członków rodzin, którzy mają swój minimalny wpływ równy minimalnemu w całej rodzinie. Dla porównania inny wariant - w którym dla każdej rodziny podawane jest dokładnie jedno imię - wymaga dodatkowego kryterium, według którego imię będzie wybierane. Na przykład max: select nazwisko, max(imie), min(wplyw) from ( select nazwisko, imie, min(wplyw) wplyw from ...join ... group by nazwisko, imie having min(wplyw) = (select min(wplyw) from rodzina r where r.nazwisko = rodzina.nazwisko) ) as tmp group by nazwisko
Zwróć uwagę na "as tmp". Z pewnych względów składnia wymaga, żeby w takim zapytaniu zdefiniować alias podzapytania - bez tego nie zadziała. Może to wyglądać trochę koszmarnie, ale jeśli wziąć pod uwagę, że to jest proces kilkuetapowy (w sensie logicznym), to myślę, że to i tak niewielka cena za możliwość otrzymania takiego wyniku w jednym poleceniu. Analogicznie można odczytać maksymalne wpływy. Moim zdaniem lepiej nie robić tego w jednym zapytaniu razem z minimum, ale jeśli już musisz, to spróbowałbym najprościej czyli z użyciem union
-- Pozdrawiam :-) Bartek
Grzechu - 03-01-2006 10:29
On Mon, 2 Jan 2006, Bartek Dajewski wrote:
> > Da się i bez magii i widoków.
>[...] > -- > Pozdrawiam :-) > Bartek
Olbrzymie podziekowania za odpowiedz!
Pozdrawiam serdecznie Grzechu
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Zdalny =?ISO-8859-2?Q?dost=EAp_do_MSSQL_bez_zarz=B1dzani?==?ISO-8859-2?Q?a?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
[MSSQL 2k] - jak =?ISO-8859-2?Q?pod=B3=B1czy=E6_serwer_na_?==?ISO-8859-2?Q?porcie_innym_ni=BF_1433=3F?=
MSSQL Express czy Oracle Express
MSSQL 2005 i uruchamianie procedury o =?ISO-8859-2?Q?okre=B6lone?==?ISO-8859-2?Q?j_godzinie?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
[MSSQL 2000] =?ISO-8859-2?Q?wywo=B3anie_procesu_z_poziomu_?==?ISO-8859-2?Q?job=27a?=
[MSSQL 2K] =?ISO-8859-2?Q?Wp=B3yw_ustawie=F1_regionalnych_?==?ISO-8859-2?Q?serwera_na_zapytania?=
Pobierananie danych z innej bazy danych w MSSQL
Migracja MSSQL 2005 CTP na 2005 Express
zanotowane.pldoc.pisz.plpdf.pisz.pllubiatowo.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|