SQL - 使用日历日粒度构建事实表

时间:2013-01-15 20:12:47

标签: sql-server ssas mdx cube

我有一个数据集(DATASET1),列出了所有员工的部门ID,他们开始的日期和他们被终止的日期。

我希望我的查询返回一个数据集,其中每一行代表每个员工一天的工作日,工作天数(Start-to-Date)。

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

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查询来实现这个目标,但是如何?

2 个答案:

答案 0 :(得分: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 |

答案 1 :(得分:0)

SELECT DeptID, EmployeeID, Date, DATEDIFF(DAY, StartDate, '3/1/2011') AS ofDaysWorked
FROM DATASET1

看看是否有效!