0

これは私の前の質問の続きですが、単純化しようとしたため、何かを見逃しているようですcte loop を使用した Daily snapshot table

日付と従業員テーブルの間に以下のクロス結合を設定しようとしています。部門と部門に応じた毎日のカウントが必要ですが、日付は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)

希望する出力:
Date 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 に答える