这是我先前提出的问题的后续内容,但是由于我试图简化,所以我似乎错过了一些Daily snapshot table using cte loop
我正在尝试在日期和员工表之间建立以下交叉联接。我需要根据部门和部门进行每日盘点,但是日期无法轻松链接,因为日期存储为varchar(不是我的选择,我无法更改)。
我现在有一个日期表,该日期表包含可以链接到该表的style112(yyyymmdd)键,但是在联接的某处似乎失败了。
我是如此接近,但真的迷路了!我从不需要处理字符串日期,也不希望有人使用它。
DECLARE @DATESTART AS Date = '20180928';
DECLARE @DATEEND AS Date = '20181031';
WITH Dates AS (
SELECT @DATESTART AS Dte
UNION ALL
SELECT DTE + 1
FROM Dates
WHERE Dte <= @DATEEND )
SELECT
Dt.Dte
,CAST(DTC.Style112 AS VARCHAR)
,Emp.Division_Description
,Emp.Department_Description
,(SELECT
COUNT(*)
FROM ASS_D_EmpMaster_Live E
WHERE
E.[Start_Date] <= CAST(DTC.Style112 AS VARCHAR)
AND (E.Leaving_Date > CAST(DTC.Style112 AS VARCHAR)
OR E.Leaving_Date = '00000000')
) Counts
FROM Dates Dt
LEFT JOIN ASS_C_DateConversions DTC
ON DTC.[Date] = Dt.DtE
CROSS JOIN
(
SELECT DISTINCT
Division_Description
,Department_Description
FROM
ASS_D_EmpMaster_Live e
) Emp
OPTION (MAXRECURSION 1000)
所需的输出:
日期
部门1
部门2
部门3
20180901
25
231
154
20180902
23
232
154
答案 0 :(得分:0)
我认为您根本不需要转换表,因此我将其删除。而且我相信子查询应如下所示:
SELECT COUNT(*)
FROM ASS_D_EmpMaster_Live E
WHERE
CAST(E.Start_Date AS DATE) <= Dt.Dte
AND (CAST(E.Leaving_Date AS DATE) > Dt.Dte OR E.Leaving_Date = '00000000')