Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-使用日历日粒度构建事实表_Sql Server_Ssas_Mdx_Cube - Fatal编程技术网

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

Sql server SQL-使用日历日粒度构建事实表,sql-server,ssas,mdx,cube,Sql Server,Ssas,Mdx,Cube,我有一个数据集DATASET1,其中列出了所有员工及其部门ID、开始日期和终止日期 我希望我的查询返回一个数据集,其中每一行代表每个员工的一天,以及从开始到现在的工作天数 如何处理此查询?提前谢谢你的帮助 数据集1 DeptID EmployeeID StartDate EndDate -------------------------------------------- 001 123 20100101 20120101 001

我有一个数据集DATASET1,其中列出了所有员工及其部门ID、开始日期和终止日期

我希望我的查询返回一个数据集,其中每一行代表每个员工的一天,以及从开始到现在的工作天数

如何处理此查询?提前谢谢你的帮助

数据集1

DeptID     EmployeeID   StartDate   EndDate
--------------------------------------------
001        123           20100101   20120101   
001        124           20100505   20130101
数据集2

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

EIDT:我的目标是构建一个事实表,用于在SSAS中导出度量。我正在建立的衡量标准是“平均就业时间”。该度量将部署在仪表板中,用户将能够选择一个日历周期,并深入到月、周和天。这就是为什么我需要从这么大的数据集开始。也许我可以通过使用MDX查询来实现这一目标,但如何实现呢?

您可以使用递归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)

看看这是否有效

这是可能的,但不太可能有用-你的最终目标是什么?我想有一种更简单的方法可以到达那里。你为什么要返回所有这些数据?如果员工已受雇10年,您将返回3652行。您应该在代码中进行迭代。StartDate和EndDate列的数据类型是什么?CHAR/VARCHAR6还是日期?DATE或DATETIME更容易使用…我正在构建一个事实表,以导出SSAS中的度量值。衡量标准是“平均就业时间”。我知道这个查询会生成很多记录,但事实表就是这样工作的。最终,聚合将进入一个多维数据集。最终用户将能够深入到日期周期-年、月、周、日。如果需要使用Analysis Services,则需要从数据集派生星形模式,从该模式创建多维数据集,使用某种形式的ETL工具或流程将数据集提取/转换/加载到模式中,然后使用MDX从仪表板进行查询。如果您实际上是从头开始构建仪表板,那么简单的SQL查询并不是答案。您的查询不会在工作期间每天创建记录。
| 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 |
SELECT DeptID, EmployeeID, Date, DATEDIFF(DAY, StartDate, '3/1/2011') AS ofDaysWorked
FROM DATASET1