#sql
#sql
Вопрос:
Объявить @таблице EMPTABLE ( идентификатор [инт] идентичность(1,1) не null, EMPCODE тип varchar(200)) вставить в @EMPTABLE выберите EmployeeCode от Tbl_Emp_TimeRegister с(подсказку nolock) внутреннее соединение Tbl_Emp_Details ЭД с(подсказку nolock) на авт.Кодсотрудника=а.Кодсотрудника
где.StatusId = (62) и Active = 1 и для, Между 2021-11-01 » и » 2021-11-30 группы по EmployeeCode ,StatusId, имеющих считать (.StatusId) gt; 5, если объект object_id(‘базы данных tempdb..#разработана’) НЕ ЯВЛЯЕТСЯ НУЛЕВОЙ ТАБЛИЦЕЙ ОТБРАСЫВАНИЯ #ИТОГОВЫЙ СЧЕТ СОЗДАЙТЕ ТАБЛИЦУ #ИТОГОВЫЙ СЧЕТ ([Итоговый счет] INT,EMPCode varchar(200))
DECLARE @Counter INT ,@EmPCode varchar(200) SET @Counter=1
ОБЪЯВИТЕ КУРСОР emp_cursor ДЛЯ ВЫБЕРИТЕ EMPCODE ИЗ @EMPTABLE
ОТКРОЙТЕ emp_cursor
FETCH NEXT FROM emp_cursor INTO @EmPCode --print 'Employee_Code ' @EmPCode WHILE @@FETCH_STATUS = 0 BEGIN IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T CREATE TABLE #T ( MyDate DATE,EmployeeCode varchar(200),StatusId INT) ; insert into #T select format(Forday, 'yyyy-MM-dd') as date,EmployeeCode,a.StatusId from Tbl_Emp_TimeRegister a with(nolock) INNER JOIN Tbl_Emp_Details ED with(nolock) on ED.EmployeeId=a.EmployeeId where a.StatusId IN(62,71,69) And Active =1 AND EmployeeCode=@EmPCode and Forday between '2021-11-01' and '2021-11-30' DECLARE @chkCount int=0,@maxDate date=null,@minDate date=null DECLARE @LOCAL_TABLEVARIABLE TABLE ( Id [int] IDENTITY(1,1) NOT NULL, RW INT, FromDate DATE, EMPCODE VARCHAR(100) ) INSERT INTO @LOCAL_TABLEVARIABLE SELECT RW=ROW_NUMBER() OVER( PARTITION BY GRP ORDER BY MyDate) ,MyDate,EmployeeCode FROM ( SELECT MyDate, DATEDIFF(Day, '1900-01-01' , MyDate)- ROW_NUMBER() OVER( ORDER BY MyDate ) AS GRP,EmployeeCode FROM #T ) A select top 1 @chkCount = RW-1,@maxDate = FromDate from @LOCAL_TABLEVARIABLE where EMPCODE=@EmPCode order by rw desc --print @chkCount print @maxDate print @EmPCode IF @chkCount gt;= 5 BEGIN select @minDate = DATEADD(DAY, -@chkCount, @maxDate) --print @minDate ;WITH CTE1 (Date) AS( SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) 1) Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) FROM sys.all_objects a CROSS JOIN sys.all_objects b ) INSERT INTO #TotalCount select COUNT(*),@EmPCode from CTE1 where Date not in( select format(Forday, 'yyyy-MM-dd') AS Date from Tbl_Emp_TimeRegister a with(nolock) INNER JOIN Tbl_Emp_Details ED with(nolock) on ED.EmployeeId=a.EmployeeId where a.StatusId IN(71,69) AND EmployeeCode=@EmPCode and Forday between '2021-11-01' and '2021-11-30' ) END FETCH NEXT FROM emp_cursor INTO @EmPCode END
ЗАКРЫТЬ emp_cursor; ОСВОБОДИТЬ emp_cursor;
выберите * из #Итоговый счет
Комментарии:
1. Добро пожаловать на SO ! В чем заключается ваш вопрос ? В чем ваша проблема ?