从两个表中筛选数据,求助!

land_L 2014-10-10 04:44:57
需求是“获取某月份某企业员工的工资”

表有三个:
企业员工表 A (企业code,员工code)
工资表 B (金额,调整时间)
历史工资表 C(金额,调整时间)

B中存的是现在使用的员工工资,
C中是调整之前的员工工资(如果有的话)

比如我要得到8月份某企业 a1的所有员工的工资情况,因为可能8月之后员工的工资被调整了,就需要在C中找,求问怎么去筛选比较好!!

...全文
126 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
land_L 2014-10-10
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
WITH D AS (
    -- 先选出到8月份为止的调整数据(假定调整时间为8月份的工资在9月起效)
    SELECT * FROM B WHERE 调整时间 < '2014-08-01'
    UNION ALL
    SELECT * FROM C WHERE 调整时间 < '2014-08-01'
),
E AS (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY 员工code ORDER BY 调整时间 DESC) n
      FROM D
),
F AS (
    -- 选出离8月份最近的调整数据
    SELECT 员工code,金额,调整时间
      FROM E
     WHERE n = 1
)
SELECT A.企业code,
       A.员工code,
       F.金额 AS '工资'
  FROM A
  JOIN F
    ON F.员工code = A.员工code
 WHERE ...
不能更赞! 谢谢各位!!!给分给分~~
frankl123 2014-10-10
  • 打赏
  • 举报
回复
你最好自己弄点数据上来 如果表C中的调整日期是8月份,生效期是8月 还是9月?
Tiger_Zhao 2014-10-10
  • 打赏
  • 举报
回复
WITH D AS (
-- 先选出到8月份为止的调整数据(假定调整时间为8月份的工资在9月起效)
SELECT * FROM B WHERE 调整时间 < '2014-08-01'
UNION ALL
SELECT * FROM C WHERE 调整时间 < '2014-08-01'
),
E AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY 员工code ORDER BY 调整时间 DESC) n
FROM D
),
F AS (
-- 选出离8月份最近的调整数据
SELECT 员工code,金额,调整时间
FROM E
WHERE n = 1
)
SELECT A.企业code,
A.员工code,
F.金额 AS '工资'
FROM A
JOIN F
ON F.员工code = A.员工code
WHERE ...
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
引用 6 楼 land_L 的回复:
[quote=引用 2 楼 ky_min 的回复:]
select * from A LEFT JOIN C ON A.员工Code=C.员工Code WHERE 调整时间>='2014-08-01' AND 调整时间<'2014-09-01'
你的意思是这个吗?
额,关键你不知道该连哪个表 如果8月份之后某个员工的工资没有被调整,那么他的工资数据就还在表B里面,而C里面是查不到的 [/quote] 那就先把两张表UNION ALL 起来,可以吗? SELECT * FROM B UNION ALL SELECT * FROM C 把这个当成上面那个语句里的C来查~~
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 6 楼 land_L 的回复:
[quote=引用 2 楼 ky_min 的回复:]
select * from A LEFT JOIN C ON A.员工Code=C.员工Code WHERE 调整时间>='2014-08-01' AND 调整时间<'2014-09-01'
你的意思是这个吗?
额,关键你不知道该连哪个表 如果8月份之后某个员工的工资没有被调整,那么他的工资数据就还在表B里面,而C里面是查不到的 [/quote] 换个逻辑 with cte as (select * from b union all select * from c) 然后在这个表里面进行查询。就都有了。
land_L 2014-10-10
  • 打赏
  • 举报
回复
引用 2 楼 ky_min 的回复:
select * from A LEFT JOIN C ON A.员工Code=C.员工Code WHERE 调整时间>='2014-08-01' AND 调整时间<'2014-09-01'
你的意思是这个吗?
额,关键你不知道该连哪个表 如果8月份之后某个员工的工资没有被调整,那么他的工资数据就还在表B里面,而C里面是查不到的
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复

select* from (
select *,ROW_NUMBER()over(partition by 员工code  order by 调整时间 desc)as n
 from C  join A on a.员工code =c.code and a.企业CODE='a1'
and c.调整时间<'2014-09-01') as t
where t.n=1
逻辑就是找出该员工调整时间小于‘2014-09-01’的最大日期。就是8月份的生效工资。
reenjie 2014-10-10
  • 打赏
  • 举报
回复
with cte as ( select userCode,username from A where companyCode='a1' ) select aa.username,salary from B,cte as aa where B.UserCode=aa.UserCode and Month(AdjustmentDate)=8 and Year(AdjustmentDate)=2014 union all select aa.username,salary from C,cte as aa where C.UserCode=aa.UserCode and Month(AdjustmentDate)<8 and Year(AdjustmentDate)<=2014
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 1 楼 land_L 的回复:
补充 B (员工code,金额, 调整时间) C (员工code,金额,调整时间)
这里有个问题。工资 调整时间是‘2014-09-14’ 这个生效时间是10月份吗?9月份还是之前的工资了。
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
select * from A LEFT JOIN C ON A.员工Code=C.员工Code WHERE 调整时间>='2014-08-01' AND 调整时间<'2014-09-01'
你的意思是这个吗?
land_L 2014-10-10
  • 打赏
  • 举报
回复
补充 B (员工code,金额, 调整时间) C (员工code,金额,调整时间)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧