日期:2014-05-16  浏览次数:20694 次

查询岗位年限语句
求一查询语句。

存在表t 字段说明如下:
EMPLOYEE_NUMBER  工号
EMPLOYEE_NAME    姓名
EFFECTIVE_START_DATE  分配开始时间
EFFECTIVE_END_DATE    分配结束时间
NAME    岗位名称

表中数据如下:
EMPLOYEE_NUMBER EMPLOYEE_NAME EFFECTIVE_START_DATE EFFECTIVE_END_DATE NAME
8630050 张三 2012-2-1 4712-12-31 装配工.火花塞安装(2线)
8630050 张三 2011-12-19 2012-1-31 装配工.火花塞安装(2线)
8630050 张三 2011-4-1 2011-12-18 装配工..\
8630050 张三 2010-12-28 2011-3-31 装配工..\
8630050 张三 2010-2-1 2010-12-27 装配工.D.\
8630050 张三 2009-5-18 2010-1-31 装配工.D.\
8630050 张三 2008-1-1 2009-5-17 装配工.D.\
8630050 张三 2007-11-1 2007-12-31 装配工.D.\
8630050 张三 2003-7-1 2007-10-31 装配工..\

说明:1、如果effective_end_date为4712-12-31则表示员工的当前岗位为此岗位,计算当前岗位第一次分配开始时间和当前时间的年限
2、如果不是当前的岗位,计算岗位第一次分配开始时间和岗位最后一次分配结束时间
的年限
3、只计算岗位名称是联系的年限。如上表中岗位装配工..\岗位,最后一条分配记录当做一条记录来计算;2、3条记录就当做是同一次分配来计算年限


我想查询出的结果如下:


EMPLOYEE_NUMBER EMPLOYEE_NAME EFFECTIVE_START_DATE EFFECTIVE_END_DATE NAME year
8630050 张三 2011-12-19 4712-12-31 装配工.火花塞安装(2线) 2.1
8630050 张三 2010-12-28 2011-12-18 装配工..\ 0.9
8630050 张三 2007-11-1 2010-12-27 装配工.D.\ 4
8630050 张三 2003-7-1 2007-10-31 装配工..\ 4.3

------解决方案--------------------
select EMPLOYEE_NUMBER,EMPLOYEE_NAME,EFFECTIVE_START_DATE, EFFECTIVE_END_DATE, NAME, 
[year]=CASE WHEN EFFECTIVE_END_DATE='4712-12-31' THEN DATEDIFF(DD,EFFECTIVE_START_DATE,GETDATE())/365.0 ELSE DATEDIFF(DD,EFFECTIVE_START_DATE,EFFECTIVE_END_DATE)/365.0 END FROM
(select EMPLOYEE_NUMBER,EMPLOYEE_NAME,NAME,MIN(EFFECTIVE_START_DATE) AS EFFECTIVE_START_DATE,MAX(EFFECTIVE_END_DATE) AS EFFECTIVE_END_DATE
FROM t WHERE EFFECTIVE_END_DATE<>'4712-12-31'GROUP BY EMPLOYEE_NUMBER,EMPLOYEE_NAME,NAME
UNION ALL
select EMPLOYEE_NUMBER,EMPLOYEE_NAME,NAME, EFFECTIVE_START_DATE, EFFECTIVE_END_DATE
FROM t WHERE EFFECTIVE_END_DATE='4712-12-31') T