Re: UNION ALL , powiazanie dwóch tabel zapytanie SQL
Filip Rembiałkowski - 10-08-2006 01:47
Quenteen wrote: > Witam mam dwie tabele: pracownicy: id_pracownik, nazwa, pensja, > data_zmiany > oraz tabele historia: id_historii, id_pracownik, nazwa, pensja, > data_zmiany > > > potrzebuje wyliczyc sume plac dla wszystkich pracownikow > znajdujacych sie w tabeli pracownicy w danym dniu.
SQL 2000 obsługuje (AFAIR) taki predykat FIRST... więc
select SUM(( select FIRST 1 pensje.pensja -- wybierz ostatnią pensję dla podanej daty from ( SELECT id_pracownik, pensja, data_zmiany FROM pracownicy UNION ALL SELECT id_pracownik, pensja, data_zmiany FROM historia ) as pensje WHERE data_zmiany <= [Forms]![fPlace].kalendarz AND id_pracownik=pracownicy.id_pracownik ORDER BY pensje.data_zmiany DESC )) as suma_pensji from pracownicy;
PS. cienka struktura danych. obejrzyj dowolny system typu "kadry i płace", tam będziesz to miał zrobione porządnie.
F.
Quenteen - 10-08-2006 01:48
Filip Rembiałkowski napisał(a): > Quenteen wrote: > > Witam mam dwie tabele: pracownicy: id_pracownik, nazwa, pensja, > > data_zmiany > > oraz tabele historia: id_historii, id_pracownik, nazwa, pensja, > > data_zmiany > > > > > > potrzebuje wyliczyc sume plac dla wszystkich pracownikow > > znajdujacych sie w tabeli pracownicy w danym dniu. > > SQL 2000 obsługuje (AFAIR) taki predykat FIRST... więc > > select SUM(( > select FIRST 1 pensje.pensja -- wybierz ostatnią pensję dla podanej > daty > from ( > SELECT id_pracownik, pensja, data_zmiany FROM pracownicy > UNION ALL > SELECT id_pracownik, pensja, data_zmiany FROM historia > ) as pensje > WHERE data_zmiany <= [Forms]![fPlace].kalendarz > AND id_pracownik=pracownicy.id_pracownik > ORDER BY pensje.data_zmiany DESC > )) as suma_pensji > from pracownicy; > > PS. cienka struktura danych. obejrzyj dowolny system typu "kadry i > płace", tam będziesz to miał zrobione porządnie. > > F.
dzieki, jak bede mial dostep to sprawdze to rozwiazanie. Natomiast strukturę miałem z góry narzuconą, no i narzędzie również - MS ACCESS 2K. Nie wiem czy przejdzie twoje rozwiazanie, ale jak mowie sprawdze to jak najszybciej. Thx.
Quenteen - 12-08-2006 01:32
takie zapytanie (odrzucilem sume)
select FIRST (pensje.pensja) from ( SELECT id_pracownik, pensja, data_zmiany FROM pracownicy UNION ALL SELECT id_pracownik, pensja, data_zmiany FROM historia ) as pensje WHERE data_zmiany <= [Forms]![fPlace].kalendarz AND id_pracownik=pracownicy.id_pracownik ORDER BY pensje.data_zmiany DESC
wyrzuca blad, ze pensje.data_zmiany nie jest elementem funkcji agregujacej.
jesli usunę linijkę ORDER BY pensje.data_zmiany DESC
to otrzymuję wynik w postaci jednego pola, które jest pensją o dacie najbliższej tej wyszukiwanej, jednak dla jednego pracownika. Query, powinno zwracac id pracownika i pensję dla kazdego pracownika.
Filip Rembiałkowski - 12-08-2006 01:32
Quenteen wrote: > takie zapytanie (odrzucilem sume) > > select FIRST (pensje.pensja) > from ( > SELECT id_pracownik, pensja, data_zmiany FROM pracownicy > UNION ALL > SELECT id_pracownik, pensja, data_zmiany FROM historia > ) as pensje > WHERE data_zmiany <= [Forms]![fPlace].kalendarz > AND id_pracownik=pracownicy.id_pracownik > ORDER BY pensje.data_zmiany DESC > > wyrzuca blad, ze pensje.data_zmiany nie jest elementem funkcji > agregujacej. > > jesli usunę linijkę ORDER BY pensje.data_zmiany DESC nie usuwaj, zmień FIRST na TOP
> > to otrzymuję wynik w postaci jednego pola, które jest pensją o dacie > najbliższej tej wyszukiwanej, jednak dla jednego pracownika. Query, > powinno zwracac id pracownika i pensję dla kazdego pracownika. tego nie napisałeś za pierwszym razem, zdecyduj się. mówiłeś o sumie wszystkich pensji za dany dzień.
Quenteen - 12-08-2006 01:32
> tego nie napisałeś za pierwszym razem, zdecyduj się. mówiłeś o > sumie wszystkich pensji za dany dzień.
Sorki, interesuje mnie suma oczywiscie, ale jak bede mial wszystkich pracownikow i pensje to suma to jedna agregacja. :-)
Filip Rembiałkowski - 12-08-2006 01:32
Quenteen wrote: > > tego nie napisałeś za pierwszym razem, zdecyduj się. mówiłeś o > > sumie wszystkich pensji za dany dzień. > > > Sorki, interesuje mnie suma oczywiscie, ale jak bede mial wszystkich > pracownikow i pensje to suma to jedna agregacja. :-)
to masz przez prostą modyfikację :
select pracownicy.id_pracownik, ( select TOP 1 pensje.pensja from ( SELECT id_pracownik, pensja, data_zmiany FROM pracownicy as a UNION ALL SELECT id_pracownik, pensja, data_zmiany FROM historia as b ) as pensje WHERE pensje.data_zmiany <= [Forms]![fPlace].kalendarz AND pensje.id_pracownik=pracownicy.id_pracownik ORDER BY pensje.data_zmiany DESC ) as pensja_na_ten_dzien from pracownicy;
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
[newbie] MS SQL - praca =?ISO-8859-2?Q?jednocze=B6nie_na_2_?==?ISO-8859-2?Q?bazach_=28linkowanie_=3F=29?=
zanotowane.pldoc.pisz.plpdf.pisz.plred-hacjenda.opx.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 |
|