0

这是我上一个问题的后续,但由于我试图简化,我似乎错过了一些使用 cte 循环的每日快照表

我正在尝试在日期和员工表之间设置以下交叉连接。我需要根据部门和部门进行每日计数,但日期不会轻易链接,因为日期存储为 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)

所需输出:
日期 Dept1 Dept2 Dept3
20180901 25 231 154
20180902 23 232 154

4

1 回答 1

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')
于 2018-11-15T17:58:27.147 回答