Столкновение операндов с таблицей дат и строками даты varchar в перекрестном соединении - PullRequest
0 голосов
/ 15 ноября 2018

Это следует из моего предыдущего вопроса, но так как я попытался упростить, я, кажется, что-то пропустил Таблица ежедневных снимков с использованием цикла cte

Я пытаюсь настроить приведенное ниже перекрестное соединение между датами и таблицей сотрудников. Мне нужен ежедневный подсчет в соответствии с отделом и отделом, но даты не будут легко связываться, так как даты хранятся как varchar (не мой выбор, я не могу его изменить).

Теперь у меня есть таблица дат, включающая ключ style112 (ггггммдд), который я могу связать с таблицей, но, похоже, произошел сбой где-то в соединениях.

Я так близко, но на самом деле я потерян! Мне никогда не приходилось работать со строковыми датами, и я бы никому этого не пожелал.

    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

1 Ответ

0 голосов
/ 15 ноября 2018

Я не думаю, что вам нужна таблица преобразования вообще, и я бы удалил ее.И я считаю, что подзапрос должен выглядеть так:

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')
...