2013-01-15 100 views
1

我有一个数据集(DATASET1),列出所有员工的部门ID,他们开始的日期和他们被终止的日期。SQL - 建立一个包含日历日粒度的事实表

我希望我的查询返回一个数据集,其中每一行代表每个员工留任的日期,以及工作天数(从开始到最新)。

我该如何查询?感谢您的帮助,提前。

dataSet1的

DeptID  EmployeeID StartDate EndDate 
-------------------------------------------- 
001  123   20100101 20120101 
001  124   20100505 20130101 

DATASET2

DeptID  EmployeeID Date  #ofDaysWorked 
-------------------------------------------- 
001  123   20100101 1 
001  123   20100102 2 
001  123   20100103 3 
001  123   20100104 4 
....  ....   ........ ... 

EIDT:我的目标是建立这将被用来在SSAS推导措施的事实表。我正在制定的措施是“平均就业时间”。度量将部署在仪表板中,用户将能够选择日历时间段并深入到月,周和日。这就是为什么我需要从这么大的数据集开始。也许我可以通过使用MDX查询来完成这个目标,但是如何实现?

+3

这是可能的,但不太可能有用 - 您的最终目标是什么?我希望有一个更简单的方法到达那里。 – Hogan

+2

为什么你想要返回所有的数据?如果雇员已经工作了10年,您将返回3652行。你应该在代码中迭代。 –

+0

“StartDate”和“EndDate”列的数据类型是什么? 'CHAR/VARCHAR(6)'或'DATE'? DATE'或DATETIME'会更容易与... – Bryan

回答

2

您可以使用递归CTE来执行此:

;with data (deptid, employeeid, inc_date, enddate) as 
(
    select deptid, employeeid, startdate, enddate 
    from yourtable 
    union all 
    select deptid, employeeid, 
    dateadd(d, 1, inc_date), 
    enddate 
    from data 
    where dateadd(d, 1, inc_date) <= enddate 
) 
select deptid, 
    employeeid, 
    inc_date, 
    rn NoOfDaysWorked 
from 
(
    select deptid, employeeid, 
    inc_date, 
    row_number() over(partition by deptid, employeeid 
         order by inc_date) rn 
    from data 
) src 
OPTION(MAXRECURSION 0) 

SQL Fiddle with Demo

结果与此类似:

| DEPTID | EMPLOYEEID |  DATE | NOOFDAYSWORKED | 
----------------------------------------------------- 
|  1 |  123 | 2010-01-01 |    1 | 
|  1 |  123 | 2010-01-02 |    2 | 
|  1 |  123 | 2010-01-03 |    3 | 
|  1 |  123 | 2010-01-04 |    4 | 
|  1 |  123 | 2010-01-05 |    5 | 
|  1 |  123 | 2010-01-06 |    6 | 
|  1 |  123 | 2010-01-07 |    7 | 
|  1 |  123 | 2010-01-08 |    8 | 
|  1 |  123 | 2010-01-09 |    9 | 
|  1 |  123 | 2010-01-10 |    10 | 
|  1 |  123 | 2010-01-11 |    11 | 
|  1 |  123 | 2010-01-12 |    12 | 
0
SELECT DeptID, EmployeeID, Date, DATEDIFF(DAY, StartDate, '3/1/2011') AS ofDaysWorked 
FROM DATASET1 

看看是否能工作!

+0

您的查询不会在就业期间内每天创建一条记录。 – Thracian