2013-01-15 62 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