|
[ kenny_zakon @ 20.09.2005. 16:06 ] @
| Imam problem, i licno sam mislio da ovo moze da se uradi, ali konstantno dobijam gresku kako u SQL Sever-u, tako i u Access-u. Elem, hocu da uslovim select po uredjenim parovima, nesto kao:
select radnik, plata from tabela where (radnik, plata) in (select radnik, plata from....)
Ovako izgleda veoma banalno, ali prostije nisam mogao da definisem problem. Zasto IN ne prihvata skupove, i da li postoji neki drugi operator za to?
Pomagajte :) |
[ goranvuc @ 20.09.2005. 16:43 ] @
Moras da razdvojis uslove:
Code:
SELECT radnik, plata FROM tabela WHERE radnik IN (SELECT radnik FROM....) AND plata IN (SELECT plata FROM...)
[ kenny_zakon @ 20.09.2005. 17:20 ] @
Evo napravicu primer kako bi objasnio sta mi treba.
Imam dve tabele, prva je radnik:
radnik | plata | id_odeljenje
Ivan - 15000 - 1
Marko - 10000 - 1
Goran - 10000 - 2
Mirko - 5000 - 2
druga je odeljenje
id_odeljenje | naziv
1 - Proizvodnja
2 - Izvoz
treba mi upit koji ce izbaciti najbolje placene radnike iz svih odeljenja, dakle rezultat bi trebao da bude:
Ivan - 15000 - 1
Goran - 10000 - 2
Mislim da je to jasno, e sad upit u predhodnom postu bi izgledao ovako:
select ime, plata, id_odeljenje from radnik where (plata, id_odeljenje) IN (select max(plata), id_odeljenje from radnik group by id_odeljenje)
Da li sada neko moze pomoci???
[Ovu poruku je menjao kenny_zakon dana 20.09.2005. u 18:22 GMT+1]
[ _owl_ @ 20.09.2005. 21:46 ] @
Zar resenje tvog problema nije:
Code:
SELECT r.radnik, MAX(r.plata) as plata, o.naziv, r.id_odeljenje
FROM radnik r, odeljenje o
WHERE r.id_odeljenje=o.id_odeljenje
GROUP BY r.id_odeljenje, r.plata
Napomena: grupisanje po koloni plata mozda i nije potrebno ali mi se cini
da po SQL specifikaciji mora da se vrsi grupisanje kolona nad kojima
se vrse agregatne funkcije
Edit:
Ovaj upit se bas ne snalazi najbolje kada vise radnika ima istu platu koja je najveca u odeljenje jer se tada ispisuje ime samo jednog radnika. U tom slucaju za nalazenje odgovarajuceg upita moras da koristis subselect i kljucnu rec FOR ALL)
[Ovu poruku je menjao _owl_ dana 20.09.2005. u 23:03 GMT+1]
[ Zidar @ 22.09.2005. 16:10 ] @
SQL izkaz koji je dao _owl_ tesko da bi proradio.
Sto coveku treba moze da se resi uz upotrebu subkverija ili kombinacijom dva kverija. Ovo je bilo pitanje: Citat: treba mi upit koji ce izbaciti najbolje placene radnike iz svih odeljenja, dakle rezultat bi trebao da bude:
Ivan - 15000 - 1
Goran - 10000 - 2
Obican GROUP BY kveri daje pola resenja, vrednost max plate po odeljenju, ovako:
SELECT ID_Odeljenje, MAX(Plata) AS MaxPlata
FROM Radnik
GROUP BY ID_Odeljenje
Nedostaje Radnik (ili vise njih) za svakom odeljenje cija je plata jednaka MaxPlata.
U postojeci kveri, radnik ne moze tek tako da se ubaci. Ali moze ovo (barem u MS SQL):
Ovako moze
Code:
CREATE TABLE [tblRadnici] (
[Radnik_ID] [int] NOT NULL ,
[ID_Odeljenje] [int] NOT NULL ,
[Plata] [money] NOT NULL ,
CONSTRAINT [PK_tblRadnici] PRIMARY KEY CLUSTERED
(
[Radnik_ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
SELECT ID_Odeljenje,Plata,Radnik_ID
FROM tblRadnici
ORDER BY ID_Odeljenje, Plata DESC
ID_Odeljenje Plata Radnik_ID
------------ --------------------- -----------
1 15.0000 2
1 13.0000 4
1 12.0000 1
1 8.0000 3
2 16.0000 5
2 16.0000 8
2 15.0000 7
2 12.0000 6
3 12.0000 9
3 10.0000 10
3 8.0000 12
3 5.0000 11
(12 row(s) affected)
MS SQL statement koja zavrsava posao:
Code:
SELECT
A.Radnik_ID
, A.ID_Odeljenje
, A.Plata
FROM tblRadnici AS A
WHERE
A.Plata = (
SELECT MAX(Plata)
FROM tblRadnici As B
WHERE A.ID_Odeljenje=B.ID_Odeljenje
GROUP BY ID_Odeljenje
)
ORDER BY A.ID_Odeljenje
-- Rezulatti, primeti 2 radnika u odeljenju 3 koja imaju max platu:
Radnik_ID ID_Odeljenje Plata
----------- ------------ ---------------------
2 1 15.0000
5 2 16.0000
8 2 16.0000
9 3 12.0000
(4 row(s) affected)
Mozda je lakse iz dva koraka:
Code:
-- Kreiras view
CREATE VIEW dbo.vwMaxPlata
AS
SELECT ID_Odeljenje, MAX(Plata) AS MaxPlata
FROM tblRadnici AS A
GROUP BY ID_Odeljenje
GO
--- onda kombinujes view i tabelu:
SELECT
A.Radnik_ID
, A.ID_Odeljenje
, A.Plata
FROM tblRadnici AS A
INNER JOIN vwMaxPlata AS B
ON A.ID_Odeljenje=B.ID_Odeljenje
AND A.Plata=B.MaxPlata
ORDER BY A.ID_Odeljenje
-- Rezultati:
Radnik_ID ID_Odeljenje Plata
----------- ------------ ---------------------
2 1 15.0000
5 2 16.0000
8 2 16.0000
9 3 12.0000
(4 row(s) affected)
Nadam se da je pomoglo.
[ kenny_zakon @ 26.09.2005. 19:22 ] @
Svaka cast!!! :)
[ branimir.ts @ 11.11.2005. 11:29 ] @
Citat: Zidar: SQL izkaz koji je dao _owl_ tesko da bi proradio.
Mozda je lakse iz dva koraka:
Code:
-- Kreiras view
CREATE VIEW dbo.vwMaxPlata
AS
SELECT ID_Odeljenje, MAX(Plata) AS MaxPlata
FROM tblRadnici AS A
GROUP BY ID_Odeljenje
GO
--- onda kombinujes view i tabelu:
SELECT
A.Radnik_ID
, A.ID_Odeljenje
, A.Plata
FROM tblRadnici AS A
INNER JOIN vwMaxPlata AS B
ON A.ID_Odeljenje=B.ID_Odeljenje
AND A.Plata=B.MaxPlata
ORDER BY A.ID_Odeljenje
-- Rezultati:
Radnik_ID ID_Odeljenje Plata
----------- ------------ ---------------------
2 1 15.0000
5 2 16.0000
8 2 16.0000
9 3 12.0000
(4 row(s) affected)
Zasto ste toliko iskomplikovali stvar ? Zar nije prirodnije da query izgleda ovako :
SELECT odelenje,
(SELECT top 1 radnik FROM Radnici r WHERE r.odelenje = o.[id] ORDER BY plata DESC ) AS ImeRadnika,
(SELECT top 1 plata FROM Radnici r WHERE r.odelenje = o.[id] ORDER BY plata desc ) AS Plata
FROM Odelenja AS o
ORDER BY Odelenje;
Pozdrav
[Ovu poruku je menjao branimir.ts dana 11.11.2005. u 12:32 GMT+1]
[ Zidar @ 14.11.2005. 19:03 ] @
Sta je prirodnije, to je filozofsko pitanje
Tvoje resenje radi, i dobro je da si ga postavio, hvala na prilogu.
Ima jedna sitna razlika u resenjime. Tvoje resenje ce dati tacno jednog radnika po odeljenju. Medjutim, ako u odeljenju ima vise radnika koji imaju maksimalnu platu, tvoj kveri ce i dalje prikazivati samo jednog od njih, kojeg, to niko ne zna. Kveri koji sam ja postavio vratice sve radnike koji imaju najvecu platu u odeljenju. U zavisnosto od toga sta se trazi, jedan ili drugi kveri ce odraditi posao.
Za pitanje "Prikazi tacno jednog radnika po odeljenju sa maksimalnom platom" tvoj kveri daje bolji odgovor - tacno jednog radnika.
Za pitanje:"Prikazi (sve) radnike koji imaju najvecu platu u odeljenju" moj kveri daje tacan odgovor - sve radnike.
A ono sa dva koraka, to je zbog jasnoce. Ni moj kveri-subkveri ni tvoj kveri-subkveri nisu bas ocigledni na prvi pogled za nekoga ko se s tim nije sreo.
[Ovu poruku je menjao Zidar dana 14.11.2005. u 20:04 GMT+1]
[ branimir.ts @ 15.11.2005. 08:09 ] @
Citat: Zidar: Sta je prirodnije, to je filozofsko pitanje :-)
Za pitanje:"Prikazi (sve) radnike koji imaju najvecu platu u odeljenju" moj kveri daje tacan odgovor - sve radnike.
Mislis, sve radnike ciji je iznos plate jednak, i ciji je iznos plate ujedno najveci- u odredjenom odeljenju.
Zanima me, kako bi ti sutradan modifikovao tvoj query (ako se poslodavac , recimo predomisli) , da ti prikazuje tacno 4 radnika po odredjenom odeljenju , sa najvecom platom-- u tome i jeste poenta mog pristupa.
Pozdrav
[ jablan @ 15.11.2005. 08:35 ] @
Citat: branimir.ts: Zanima me, kako bi ti sutradan modifikovao tvoj query (ako se poslodavac , recimo predomisli) , da ti prikazuje tacno 4 radnika po odredjenom odeljenju , sa najvecom platom-- u tome i jeste poenta mog pristupa.
A kako bi to tačno izgledalo u tvom pristupu? TOP 4 u subquery-ju?
[ branimir.ts @ 15.11.2005. 10:10 ] @
Citat: jablan: A kako bi to tačno izgledalo u tvom pristupu? TOP 4 u subquery-ju?
Hehe. Naravno da ne. Top X u mom queryju je genericko polje, sto znaci da ne moze vratiti vise od jedne vrednosti, u konstrukciji ovakvog tipa.
Na MSSQL resenje za Top X vrednosti bi bilo otvaranje cursora nad tabelom Odelenja , a zatim uparivati Top x konstrukcije sa Id om Odeljenja u petlji.
Pozdrav
[ Zidar @ 15.11.2005. 15:29 ] @
Citat: Zanima me, kako bi ti sutradan modifikovao tvoj query (ako se poslodavac , recimo predomisli) , da ti prikazuje tacno 4 radnika po odredjenom odeljenju , sa najvecom platom-- u tome i jeste poenta mog pristupa.
Pa, tvoj i moj kveri daju odgovor na dva razlicita pitanja i nemoguce je modifikovati bilo koji od nijh tako da daje rezultat kao onaj drugi. Ako je i moguce, nema mnogo smisla, ponavljam, oni daju odgovor na razlicita pitanja. Ako se poslodavac predomisli, pa toliko promeni pitanje, dobice novi kveri. Da li ce on to i da plati, to je vec van ove diskusije.
Slusaj, ne pokusavam da kazem da je bilo koji od dva kverija bolji od drugoga. Sve zavisi kako je pitanje postavljeno i kako je shvaceno. Originalno pitanje je postavljeno tako da se moze shvatiti i na jedan i na drugi nacin. Verovatno da bi pravi odgovor gazdi u ovoj situaciji bio: "ako hoces tacno jednog radnika po odeljenju, uzmi kveri tipa 'branimir.ts', a ako hoces sve radnike, uzmi kveri tipa 'zidar'. ako hoces oba odgovora, trebace ti oba kverija". I ti i ja smo pogresili sto smo nedovoljno artikulisano pitanje shvatili na nacin koji nam se dopao.
:-)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|