2010-09-20 5 views
1

Supposons que j'ai deux tablesTSQL REJOIGNEZ clarification

declare @emp table 
(
    EmpID int, 
    EmpName varchar(10) 

) 

declare @Remu table 
(
    EmpID int, 
    Sal Decimal(10,2), 
    PaidYear varchar(10) 
) 

Je veux salaire maximum groupés sur PaidYear (avec liens)

attendu SORTIE

EmpID EmpName PaidYear Sal 
1  Jon  2001  2000 
2  Smith 2001  2000 

3  Nash 2003  4000  
4  Hoge 2005  5000 
5  Peter 2005  5000 

J'ai un problème lors de l'utilisation Rejoindre

select e.EmpID,e.EmpName,r.Sal,r.PaidYear from @emp e 
inner join 
(select max(Sal) as Sal,PaidYear from @Remu group by PaidYear)r 
on e.EmpID=??? 

lorsque je sélectionne EmpID dans

select max(Sal) as Sal,PaidYear from @Remu group by PaidYear 

je dois groupe par PaidYear et EmpID, qui ne donnera pas le résultat escompté comme je m'y attendais.

Comment résoudre this.I veulent une requête qui devrait être compatible avec SQL Server 2000.

+0

Oui question est édité – Amit

Répondre

1
select e.EmpID,e.EmpName,r.Sal,r.PaidYear 
from @emp e inner join @Remu r on e.EmpId = r.EmpId 
where r.sal in (select max(sal) from @remu group by paidyear) 
+0

Ce n'est pas correct. Vous dites que «n'importe quel» salaire qui arrive à être le maximum dans une année donnée peut être considéré comme le maximum pour une année spécifique. – JeffO

+0

@Jeff n'a pas pu vous obtenir. Si vous pouvez m'expliquer ou me donner un exemple, je peux me corriger. – Kashif

+0

l'instruction select dans vous où clause va retourner une liste du salaire le plus important pour chaque année. Exemple: En l'an 2000, il pourrait être 3000 et en 2001, il pourrait être 4000, mais si quelqu'un a fait 3000 en 2001, ils apparaîtraient également dans votre requête. Vous ne le limitez pas pour correspondre à la même année. Vois ma réponse. – JeffO

0

Chaque année doit déterminer un salaire maximum spécifique à cette année.

select e.EmpID 
    , e.EmpName 
    , r.Sal 
    , r.PaidYear 
from @emp as e 
inner join @Remu as r 
on e.EmpId = r.EmpId 
where r.sal = (select max(sal) 
       from @remu 
       where paidyear = r.PaidYear ' makes it year specific 
      ) 

données à tester:

declare @emp table 
( 
    EmpID int, 
    EmpName varchar(10) 

) 

declare @Remu table 
( 
    EmpID int, 
    Sal Decimal(10,2), 
    PaidYear varchar(10) 
) 

insert into @emp (EmpID, EmpName) 
values(1, 'Jon') 
insert into @emp (EmpID, EmpName) 
values(2, 'Smith') 
insert into @emp (EmpID, EmpName) 
values(3, 'Nash') 
insert into @emp (EmpID, EmpName) 
values(4, 'Hoge') 
insert into @emp (EmpID, EmpName) 
values(5, 'Peter') 

Insert into @Remu (EmpID, Sal, PaidYear) 
values(1, 2000, '2001') 

Insert into @Remu (EmpID, Sal, PaidYear) 
values(2, 4999, '2001') 

Insert into @Remu (EmpID, Sal, PaidYear) 
values(2, 8000, '2003') 

Insert into @Remu (EmpID, Sal, PaidYear) 
values(3,4000, '2003')  

Insert into @Remu (EmpID, Sal, PaidYear) 
values(4, 5000, '2005')  

Insert into @Remu (EmpID, Sal, PaidYear) 
values(5, 4999, '2005') 

Résultats:

EmpID EmpName Sal PaidYear 
4   Hoge 5000.00 2005 
2   Smith 8000.00 2003 
2   Smith 4999.00 2001 
+0

merci de me l'avoir montré. Mais avec tout le respect que je ne vois pas de différence parce que je GROUP BY sur PaidYear. J'ai mis quelques données et couru les deux requêtes et il n'y a aucune différence. Pouvez-vous s'il vous plaît me montrer la différence. Ce serait tellement gentil de ta part. – Kashif

+0

@Muhammad Kashif Nadeem - J'ai ajouté du code pour insérer des enregistrements de test. Testez votre requête et vous verrez que «Peter» et «Hoge» apparaissent tous les deux comme ayant un salaire maximum en 2005 bien qu'ils aient des salaires différents. La raison en est le salaire pour 'Peter' correspond à un salaire maximum d'une autre année (2001) .. – JeffO

+0

merci encore. J'ai exécuté à la fois, le vôtre et le mien, requête en utilisant vos données et le résultat est le même. J'ai fait cet exercice plus tôt et je n'ai pas trouvé de différence, c'est pourquoi je vous ai demandé où est la différence de résultats entre votre et ma requête. – Kashif