求教一条SQL语句

我有一个表如下:
姓名 日期 薪水
A 2002-01-01 1000
A 2002-02-01 1500
A 2001-03-01 800
B 2002-01-01 1100
B 2002-02-01 1000
B 2001-05-01 1600
B 2000-06-01 2000
C 2002-01-01 100
C 2002-02-01 1000
C 2001-03-01 2000
D 2002-01-01 1000
D 2002-02-01 800
想得到如下结果集,即:
姓名 日期 薪水
A 2002-01-01 1000
A 2002-02-01 1500
A 2001-03-01 800
B 2002-02-01 1000
B 2002-01-01 1100
B 2001-05-01 1600
C 2002-02-01 1000
C 2002-01-01 100
C 2001-03-01 2000
D 2002-02-01 800
D 2002-01-01 1000
也就是说取出所有人最近三个月的薪水情况(注意:最近三个月指某员工最近领取过薪水的三个月,而不是从当前时间往回推三个月)
请教一下能否只有一条语句就完成?
---------------------------------------------------------------

select * from table A
where A.id in(select top 3 id from table Where a.id=table1.id)
---------------------------------------------------------------

select * from a x
where 日期 in (select top 3 日期 from a
where 姓名 = x.姓名
order by 日期 desc)
order by 姓名,日期;

---------------------------------------------------------------

同意楼上星级专家意见
---------------------------------------------------------------

该再开个帖子了:)

select t1.id,t1.姓名,t1.性别,t1.工作年限,t2.日期,t2.薪水,t2.房贴,t2.项目奖
from tab1 t1 join (select id,日期,薪水 =isnull(sum(case when 类别='薪水' then 数额 else 0 end),0) ,
房贴 =isnull(sum(case when 类别='房贴' then 数额 else 0 end),0) ,
项目奖=isnull(sum(case when 类别='项目奖' then 数额 else 0 end),0)
from tab2 group by id,日期) t2 on t1.id=t2.id
order by t1.id

如果还有别的项目,自己加CASE语句吧
---------------------------------------------------------------

以下语句与不加DISTINCT有何区别?呵呵

回复人: supsuccess(火气不小) ( ) 信誉:100 2002-10-23 19:16:00 得分:0

select * from a x
where 日期 in (select distinct top 3 日期 from a
where 姓名 = x.姓名
order by 日期 desc)
order by 姓名,日期

来看看我的答案,说白了还是用TOP3但是先用一个子查询将所有人员,日期重复的数据进行合并,然后在用以上各位大哥的办法查询

SELECT *
FROM (
SELECT A.日期,A.姓名,SUM(A.金额)
FROM TABLE1 A
GROUP BY A.日期,A.姓名 ) TT
WHERE TT.日期 IN ( SELECT TOP 3 MM.日期 FROM (SELECT A.日期,A.姓名,SUM(A.金额)
FROM TABLE1 A
GROUP BY A.日期,A.姓名 ) MM
WHERE TT.姓名 = MM.姓名
ORDER BY TT.日期 DESC )

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus