[ib6|zapytanie] 1 Tabela ;)
g0mez - 18-03-2006 01:15
[ib6|zapytanie] 1 Tabela ;)
Witam, Mam tabele wplaty: nazwisko, typ, kwota
przykladowe dane: 'kowalski','M',30 'kowalski','M',20 'zdunski','S',10 'kowalski','S',10
Jak wyświetlić dane w taki sposób?: nazwisko M S kowalski 50 10 zdunski 0 10
możliwe zapytanie to: select wp0.nazwisko, (select sum(kwota) from wplaty wpm where wpm='M' and wpm.nazwisko=wp0.nazwisko) as M, (select sum(kwota) from wplaty wpm where wpm='S' and wpm.nazwisko=wp0.nazwisko) as S from wplaty wp0 group by nazwisko
Lecz jest to rozwiązanie dość wolne, nie dałoby się czegoś takiego zrobić używając złączeń?
-- Pozdrawiam, g0mez +-------------------------------------------------+ | Miejsce na Twoją reklamę | +-------------------------------------------------+
Noel - 18-03-2006 01:15
Użytkownik g0mez napisał: > Witam, > Mam tabele wplaty: > nazwisko, typ, kwota > > przykladowe dane: > 'kowalski','M',30 > 'kowalski','M',20 > 'zdunski','S',10 > 'kowalski','S',10 > > Jak wyświetlić dane w taki sposób?: > nazwisko M S > kowalski 50 10 > zdunski 0 10 > > możliwe zapytanie to: > select > wp0.nazwisko, > (select sum(kwota) from wplaty wpm where wpm='M' and > wpm.nazwisko=wp0.nazwisko) as M, > (select sum(kwota) from wplaty wpm where wpm='S' and > wpm.nazwisko=wp0.nazwisko) as S > from > wplaty wp0 > group by > nazwisko
> Lecz jest to rozwiązanie dość wolne, nie dałoby się czegoś takiego > zrobić używając złączeń?
--// pod warunkiem, że ib6 posiada 'decode':
SELECT nazwisko, DECODE(typ,'M', sum(kwota), 0) typ, DECODE(typ,'S', sum(kwota), 0) typ2 GROUP BY typ, nazwisko;
-- Tomek "Noel" B.
g0mez - 18-03-2006 01:15
Użytkownik "Noel" <tbal@go2.pll-l> napisał w wiadomości news:dve9i9$p04$1@inews.gazeta.pl... Użytkownik g0mez napisał: > Witam, > Mam tabele wplaty: > nazwisko, typ, kwota > > przykladowe dane: > 'kowalski','M',30 > 'kowalski','M',20 > 'zdunski','S',10 > 'kowalski','S',10 > > Jak wyświetlić dane w taki sposób?: > nazwisko M S > kowalski 50 10 > zdunski 0 10 > > możliwe zapytanie to: > select > wp0.nazwisko, > (select sum(kwota) from wplaty wpm where wpm='M' and > wpm.nazwisko=wp0.nazwisko) as M, > (select sum(kwota) from wplaty wpm where wpm='S' and > wpm.nazwisko=wp0.nazwisko) as S > from > wplaty wp0 > group by > nazwisko
> Lecz jest to rozwiązanie dość wolne, nie dałoby się czegoś takiego zrobić > używając złączeń?
--// pod warunkiem, że ib6 posiada 'decode':
Ano niestety nie obsługuje decode
-- Pozdrawiam, g0mez +-------------------------------------------------+ | Miejsce na Twoją reklamę | +-------------------------------------------------+
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 18-03-2006 01:15
"g0mez" <gosmo67@pocztaWYTNIJ.onet.pl> wrote: > Lecz jest to rozwiązanie dość wolne, nie dałoby się czegoś takiego > zrobić używając złączeń? Hm, no używając złączeń to by było coś takiego (testowane na Oracle):
select s.nazwisko, m.suma m, s.suma s from (select nazwisko, sum(kwota) suma from wplaty where typ = 'S' group by nazwisko) s full outer join (select nazwisko, sum(kwota) suma from wplaty where typ = 'M' group by nazwisko) m on s.nazwisko = m.nazwisko;
ale czy to będzie wydajniejsze, to musisz przetestować. Generalnie, jeśli jest to podstawowe zapytanie w Twoim systemie, to bym się poważnie zastanowił nad rozbiciem tego na dwie tabele (zwłaszcza jeśli nie masz do dyspozycji CASE/DECODE), albo przyspieszeniem któregoś z powyższych za pomocą odpowiednich indeksów. W Oracle rozważyłbym na pewno indeks bitmapowy na TYP, ale w IB chyba nie ma czegoś takiego...
-- Michał Kuratczyk
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 18-03-2006 01:15
Michał Kuratczyk <kura@lj.pl> wrote: > przyspieszeniem któregoś z powyższych za pomocą odpowiednich indeksów. Jeszcze gwoli uściślenia - to pod warunkiem, że Twój przykład był uproszczony, bo jeśli faktycznie masz tylko trzy pola i potrzebujesz dane dwóch z nich na podstawie trzeciego, to indeks raczej Ci wiele nie pomoże, bo i tak musisz całą tabelę przeczytać. Ale to już tylko Ty wiesz co dokładnie masz i czego dokładnie potrzebujesz. A tego, że przykład był uproszczony domyślam się po tym, że podajesz nazwisko w każdym wierszu tabeli zamiast wydzielić dane osobowe do ostatniej tabeli (normalizacja). Nie trzymasz nazwiska w każdym wierszu, prawda? :->
-- Michał Kuratczyk
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 18-03-2006 01:15
Użytkownik g0mez napisał: > > --// pod warunkiem, że ib6 posiada 'decode': > > Ano niestety nie obsługuje decode
Oj, a nie wpadłeś na to, że inna instrukcja warunkwą trzeba użyć?
-- P.M.
wloochacz - 18-03-2006 15:11
> select s.nazwisko, m.suma m, s.suma s > from > (select nazwisko, sum(kwota) suma from wplaty where typ = 'S' group by > nazwisko) s > full outer join > (select nazwisko, sum(kwota) suma from wplaty where typ = 'M' group by > nazwisko) m > on s.nazwisko = m.nazwisko; Nie zadziała - IB6 nie obsługuje dervied tables (select from select). Nie ma rady, trzeba sobie napisać procedurę.
> ale czy to będzie wydajniejsze, to musisz przetestować. Generalnie, jeśli > jest to podstawowe zapytanie w Twoim systemie, to bym się poważnie > zastanowił nad rozbiciem tego na dwie tabele (zwłaszcza jeśli nie masz > do dyspozycji CASE/DECODE), albo przyspieszeniem któregoś z powyższych > za pomocą odpowiednich indeksów. W Oracle rozważyłbym na pewno indeks > bitmapowy na TYP, ale w IB chyba nie ma czegoś takiego... Ano, nie ma :-)
-- wloochacz
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
zanotowane.pldoc.pisz.plpdf.pisz.plnumervin.keep.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 |
|