I need daily snapshot of how many employees are employed on any given day (defined as @date between Start_Date & End_Date), with one line per date.
At one point, the below script would return all daily snapshots, but they were each returned within a separate results window. I couldn’t get the query to combine all results to insert each new result into #PLEASEWORK
.
I need to get the below to work for two consecutive days. It uses int
dates. I have inherited this problem and am building a date table to work around that problem.
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
Advertisement
Answer
You can do all this in one query. Here is one method (which is not the most efficient), but should be fine for one month.
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;
With an index on EmpMaster(Division_Description, start_date, leaving_date)
, this should be much better than a cursor-based approach.