2010-09-20 58 views
1

假设我有两个表TSQL JOIN澄清

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

) 

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

我要上PaidYear分组(含并列)的顶薪

预期输出

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

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

我有一个问题,当使用加入

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=??? 

当我在

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

选择的EmpID我必须组由PaidYear和的EmpID,这将不会得到预期的结果作为我的预期。

如何解决this.I想这应该是与SQL Server 2000

+0

有问题编辑 – Amit 2010-09-20 09:37:20

回答

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

这是不正确的。你所说的任何一年的“最高”薪水都可以被认为是特定年份的最大值。 – JeffO 2010-09-20 14:22:00

+0

@Jeff找不到你。如果你能解释或给我任何例子,所以我可以纠正自己。 – Kashif 2010-09-20 16:08:50

+0

您的select语句where子句将返回每年最高薪水的清单。例如:2000年可能是3000年,2001年可能是4000年,但如果有人在2001年出现3000年,他们也会出现在您的查询中。你不会限制它匹配同一年。看到我的答案。 – JeffO 2010-09-20 18:09:15

0

每年需要确定特定于该年单一最大薪水兼容的查询。

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 
      ) 

数据来检验:

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') 

结果:

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

感谢您向我展示此内容。但在所有方面,我没有看到任何区别,因为我在GROUP BY BY PaidYear上。我已经放了一些数据并运行这两个查询,并没有什么区别。你能告诉我不同​​之处吗?这对你真好。 – Kashif 2010-09-20 18:24:47

+0

@Muhammad Kashif Nadeem - 我已经添加了一些代码来插入测试记录。测试你的查询,你会发现尽管他们有不同的薪水,'彼得'和'霍格'在2005年都会出现最高薪水。原因是'彼得'的薪水与另一年(2001)的最高薪水相匹配。 – JeffO 2010-09-20 19:14:21

+0

再次感谢。我已经使用你的数据执行了你的和我的两个查询,结果是一样的。我早些时候做了这个练习,找不到任何不同之处,这就是为什么我问过你和我的查询之间的结果差异在哪里。 – Kashif 2010-09-21 07:59:19