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.