当前位置: 代码迷 >> Sql Server >> 从两个表中筛选数据,
  详细解决方案

从两个表中筛选数据,

热度:84   发布时间:2016-04-24 09:54:37.0
从两个表中筛选数据,求助!
需求是“获取某月份某企业员工的工资”

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

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

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


------解决思路----------------------
引用:
Quote: 引用:

select * from A LEFT JOIN C ON A.员工Code=C.员工Code WHERE 调整时间>='2014-08-01' AND 调整时间<'2014-09-01'
你的意思是这个吗?


额,关键你不知道该连哪个表

如果8月份之后某个员工的工资没有被调整,那么他的工资数据就还在表B里面,而C里面是查不到的



换个逻辑
with cte as 
(select * from b
union all 
select * from c)
然后在这个表里面进行查询。就都有了。
------解决思路----------------------
引用:
Quote: 引用:

select * from A LEFT JOIN C ON A.员工Code=C.员工Code WHERE 调整时间>='2014-08-01' AND 调整时间<'2014-09-01'
你的意思是这个吗?


额,关键你不知道该连哪个表

如果8月份之后某个员工的工资没有被调整,那么他的工资数据就还在表B里面,而C里面是查不到的


那就先把两张表UNION ALL 起来,可以吗?
SELECT * FROM B
UNION ALL
SELECT * FROM C
把这个当成上面那个语句里的C来查~~
------解决思路----------------------
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 ...
  相关解决方案