个人看法,一个小建议,那个人员信息库里的部门改为调动后的部门,然后调动表只保留调动前的部门,离职表里应该也不需要部门吧,既然离职了,那人员信息库里保存的应该就是他离职前所在的部门吧,也不知你那具体情况是不是这样,如果改成这样,查询可写成:
在职人员情况:
select * from 人员信息库 where 工号 not in (select 工号 from 离职表)离职人员情况:
select * from 人员信息库 where 工号 in (select 工号 from 离职表)调动人员情况:
select a.工号,a.姓名,b.部门 as 前部门,a.部门 as 后部门
   from 人员信息库 a join 调动表 b on a.工号=b.工号不能改的话再说一声,按你这个表做还是可以做的,可能麻烦点:)

解决方案 »

  1.   

    基本人员表:工号、姓名、部门、状态(在职为True,否则为False)人员调动表:调动ID、工号、调动原因(新员工,调动,离职等〕、时间、
    前部门(新员工此项为空)、后部门(离职此项为空〕统计在职人员从基本人员表中,条件状态为True即可
    统计调动、新员工、离职都从人员调动表即可。
      

  2.   

    按我说的那个结构:
    人员信息表(工号、姓名、现在任职部门)
    调动表(工号,调动日期,调动前部门)比如查询
    8月在职人员情况:
    select * from 人员信息库 where 现在任职部门 is not null 
    and 工号 not in (select 工号 from 调动表 where month(调动日期)<=8)
    union 
    select a.工号,a.姓名,b.调动前部门 from 人员信息库 a 
       join 
       (select a.* from 调动表 a join 
          (select 工号,max(调动日期) rq from 调动表 where month(调动日期)<=8 group by 工号) b 
           on a.工号=b.工号 and a.调动日期=b.调动日期) b 
        on a.工号=b.工号8月调动人员情况:
    select a.工号,a.姓名,a.现在任职部门,b.调动前部门 from 人员信息库 a 
       join 
       (select a.* from 调动表 a join 
          (select 工号,max(调动日期) rq from 调动表 where month(调动日期)<=8 group by 工号) b 
           on a.工号=b.工号 and a.调动日期=b.调动日期) b 
        on a.工号=b.工号8月离职人员情况:
    select a.工号,a.姓名 from 人员信息库 where 现在任职部门 is null 
    and 工号 not in (select 工号 from 调动表 where month(调动日期)>=8)
    这种结构应该来说没什么冗余,仅为参考^_^
      

  3.   

    liuri(璇玑) 说的不错,不过我还是希望获得一个更好的表结构,但是越来越觉得没有可能了,不过还有一个问题,如果某月或某时间段人员变动多次,那么在职人员的部门怎么算啊
      

  4.   

    哦,原来是你^_^我的有点毛病,不能用month(调动日期),应该用调动日期<='你的查询日期'我昨天发了一个贴,
    select a.* from 调动表 a join 
          (select 工号,max(调动日期) rq from 调动表 where month(调动日期)<=8 group by 工号) b 
           on a.工号=b.工号 and a.调动日期=b.调动日期
    还可以简单点,详见
    http://www.csdn.net/expert/topic/1056/1056711.xml?temp=.1621973
    扬兄的回答