ďťż
 
[mssql]Funkcje agregujace ďťż
 
[mssql]Funkcje agregujace
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lubiatowo.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com