Таблица ежедневных снимков с использованием цикла cte - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужен ежедневный снимок того, сколько сотрудников занято в любой день (определяется как @date между Start_Date & End_Date), с одной строкой на дату.

В какой-то момент приведенный ниже скрипт вернул бы все ежедневные снимки, но каждый из них был возвращен в отдельном окне результатов. Я не смог заставить запрос объединить все результаты, чтобы вставить каждый новый результат в #PLEASEWORK.

Мне нужно, чтобы ниже работало два дня подряд. Использует int даты. Я унаследовал эту проблему и собираю таблицу дат, чтобы обойти эту проблему.

CREATE TABLE #PLEASEWORK
(
    [Date] INT
    ,Division_Description VARCHAR (100)
    ,[Count] INT
)

DECLARE @cnt AS INT
DECLARE @DATE AS INT

SET @CNT = '20181001'

WHILE @cnt >= @DATE

BEGIN

SELECT @DATE = '20181031' - 1


TRUNCATE TABLE #PLEASEWORK
INSERT INTO #PLEASEWORK

SELECT
    @DATE [date]
    ,Division_Description
    ,COUNT(*) [Count]
--INTO #PLEASEWORK
FROM EmpMaster

WHERE
    ([Start_Date] <= @DATE
    AND Leaving_Date = 0)
    OR ([Start_Date] <= @DATE
    AND Leaving_Date > @DATE)

GROUP BY
    Division_Description


SET @cnt = @cnt + 1

CONTINUE


SELECT *

FROM #PLEASEWORK

END

1 Ответ

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

Вы можете сделать все это одним запросом. Вот один из методов (который не самый эффективный), но он подойдет для одного месяца.

declare @DATESTART date = '20181001';
declare @DATEEND date = '20181031';

with dates as (
      select @DATESTART as dte
      union all
      select dateadd(day, 1, dte)
      from dates
      where dte < @DATEEND
     )
select d.dte, dd.Division_Description,
       (select count(*)
        from EmpMaster e
        where e.Division_Description = dd.Division_Description and
              e.start_date <= d.dte and
              (e.leaving_date >= d.dte or e.leaving_date is null)
       ) as num_employees
from dates d cross join
     (select distinct Division_Description from EmpMaster) dd
order by d.dte, dd.Division_Description;

При индексе EmpMaster(Division_Description, start_date, leaving_date) это должно быть намного лучше, чем при использовании курсора.

...