Mam problem z zapytaniem, a właściwie to z jego optymalizacją.
Powiedzmy że mam tabele PRACOWNICY:
ID_Osoby | Imie | Nazwisko|
i druga ZAROBKI:
ID_Osoby | Kwota | Is_Brutto
a więc druga tabela przechowuje zarobki przy czym kwota może być netto lub brutto w zależności od pola Is_Brutto (tabela ZAROBKI przechowuje przechowuje 2 wpisy dla każdej osoby)
W wyniku chcę otrzymać:
ID_Osoby | Imie | Nazwisko| Kwota_Brutto | Kwota_Netto
I teraz moje rozwiązanie sprowadza się do podzapytania
select tabela.*, z.Kwota as Kwota_Netto (select ID_Osoby, Imie, Nazwisko, Kwota as Kwota_Brutto from PRACOWNICY p, ZAROBKI z where p. ID_OSOBY = z.ID_OSOBY AND Is_Brutto = True) tabela, ZAROBKI z where tabela.ID_OSOBY = z.ID_OSOBY and Is_Brutto = False;
tak by wyglądała moja wersja. Czy istnieje jakiś inny sposób na wykonanie tego ?
0
0
Nie testowane, ale powinno działać ;P
select
p.*,
case when z.IS_BRUTTO='TRUE' then z.Kwota else null end Kwota_brutto,
case when z.IS_BRUTTO='FALSE' then null else z.Kwota end Kwota_netto,
from
pracownicy p,
zarobki z
where
p.id_osoby = z.id_osoby;
albo
select
p.*,
decode(z.IS_BRUTTO,'TRUE',z.Kwota,null) Kwota_brutto,
decode(z.IS_BRUTTO,'TRUE',null,z.Kwota) Kwota_netto
from
pracownicy p,
zarobki z
where
p.id_osoby = z.id_osoby;
W drugim przypadku Oracle może krzyknąć o konwersje typów. Można to obejść, kwestia dodania jeszcze kilku decode na argumenty ;-)
pozdr,
yarel
0
Witam
Przepraszam za wtracanie ale rozwiązanie w kturym umieszczasz tabelę z zarobkami z kwota zależną od flagi jest nieżyciowe i do tego mało wydajne - lepiej i szybciej byłoby to zrobić poprzez wpisanie 2 kolumn netto i brutto bez flagi. dzięki temu dla każdego pracwonika możesz mieć jeden wpis w tabeli :)
pozdrawiam
piotry