Member 12605293 Ответов: 1

Как захватить только" принятый " статус отпуска и избежать повторяющихся записей


Привет ,
Я работаю над отчетом о заработной плате, и у меня есть дубликаты записей в моем сохраненном Proc, как показано ниже,и мне нужно фиксировать только принятый статус и избегать таких дубликатов записей

Что я уже пробовал:

--Select * from IntranetRelease.dbo.EmployeeDetails Where EmpName Like 'Anand%'


select Row_Number() over (order by e.EmployeeCode,AttendanceDate desc) as 'SNo',e.EmployeeName as 'EmpName',e.EmployeeCode as 'EmpId',
          d.DepartmentFName as 'DeptName',CONVERT(VARCHAR, a.AttendanceDate, 110) as 'AttendanceDate',s.ShiftName as 'Shift',Ltrim (Right(convert(varchar(20),convert(datetime, a.InTime,0),100),7)) as 'InTime',   
         convert(char(5),cast(cast((a.Duration- s.ShiftDuration) as integer)/60 as varchar)+':'+CAST(cast((a.Duration- s.ShiftDuration) as integer)%60
         as varchar),108) as 'OT',convert(char(5),cast(cast(a.Duration as integer)/60 as varchar)+':'+CAST(cast(a.Duration as integer)%60 as varchar),108)
         as 'TotDur',a.Duration,
         CASE WHEN  a.InTime> a.OutTime THEN DATEDIFF (MINUTE,CAST(a.InTime as datetime),DateAdd(day,1,CAST(a.OutTime AS datetime)))
 ELSE DATEDIFF(MINUTE, a.InTime , a.OutTime) END AS TotalMinuteDiff,
         convert(char(5),cast(cast(a.LateBy as integer)/60 as varchar)+':'+CAST(cast(a.LateBy as integer)%60 as varchar),108) as 'LateBy',
         a.Status,
         CASE WHEN substring(cast(a.PunchRecords as nvarchar(max)), (len(cast(a.PunchRecords as nvarchar(max))) - 4), case when (len(cast(a.PunchRecords as nvarchar(max)))>0) then (len(cast(a.PunchRecords as nvarchar(max))) - 5) else (len(cast(a.PunchRecords as nvarchar(max)))) end )='(in),' THEN substring(cast(a.PunchRecords as nvarchar(max)), 1, (len(cast(a.PunchRecords as nvarchar(max))) - 10))ELSE a.PunchRecords END as PunchRecords,
         
         --a.PunchRecords as ReportPunchRecords,
         IntranetReleaseNew.dbo.GetPunchRecords(a.PunchRecords) as ReportPunchRecords,
         IntranetReleaseNew.dbo.GetLastPunchRecord(a.PunchRecords) as OutTime,
         CASE WHEN la.LeaveType is null THEN '' ELSE la.LeaveType END AS 'LeaveType',
         CASE WHEN la.LeaveStatus is null THEN '' ELSE la.LeaveStatus END AS 'LeaveStatus'
         
         INTO #ResultPresent119
         
         FROM [eSSLSmartofficeNew].dbo.Employees e inner join
         [eSSLSmartofficeNew].dbo.AttendanceLogs a on e.EmployeeId=a.EmployeeId inner join 
         [eSSLSmartofficeNew].dbo.Departments d on d.DepartmentId=e.DepartmentId inner join
         [eSSLSmartofficeNew].dbo.Shifts s on s.ShiftId=a.ShiftId LEFT JOIN
	   IntranetReleaseNew.dbo.EmployeeDetails Ed ON Ed.EmpId COLLATE SQL_Latin1_General_CP1_CI_AS = e.employeecode COLLATE						SQL_Latin1_General_CP1_CI_AS LEFT JOIN  
	   IntranetReleaseNew.dbo.LeaveApplication la ON la.EmpId COLLATE SQL_Latin1_General_CP1_CI_AS = e.employeecode COLLATE						SQL_Latin1_General_CP1_CI_AS     
	   AND a.AttendanceDate >=la.leavefromdate AND a.AttendanceDate <=la.leaveTodate         
 where 
            e.EmployeeName not like '%del_%' and e.EmployeeCode like '%S%' and  (ltrim(rtrim(a.Status))='Present' or ltrim(rtrim(a.Status))='WeeklyOff Present ' or (ltrim(rtrim(a.Status))='Present' or ltrim(rtrim(a.Status))='WeeklyOff ')) and
            a.AttendanceDate>='08-21-2017' and a.AttendanceDate<='08-21-2017' and Ed.Status=0  and e.EmployeeCode ='SS339'
            and a.AttendanceDate not in(select HolidayDate from esslsmartofficenew.dbo.Holidays)
  
	UPDATE #ResultPresent119 SET PunchRecords = REPLACE(CAST(PunchRecords AS NVARCHAR(MAX)),'(out),','(out);')
	 
	;with tmp(SNo,EmpId,EmpName,DeptName,AttendanceDate,Shift, InTime, OutTime,Duration,TotalMinuteDiff,ReportPunchRecords,SinglePunch,PunchRecords,Status,LeaveType,LeaveStatus) as (
	select SNo, EmpId,EmpName,DeptName,AttendanceDate,Shift, InTime, OutTime,Duration,TotalMinuteDiff,ReportPunchRecords, LEFT(CAST(PunchRecords AS VARCHAR(MAX)), CHARINDEX(';',CAST(PunchRecords AS VARCHAR(MAX))+';')-1),
		STUFF(CAST(PunchRecords AS VARCHAR(MAX)), 1, CHARINDEX(';',CAST(PunchRecords AS VARCHAR(MAX))+';'), ''),Status,LeaveType,LeaveStatus
	from #ResultPresent119
	union all
	select SNo,EmpId,EmpName,DeptName,AttendanceDate,Shift, InTime, OutTime,Duration,TotalMinuteDiff,ReportPunchRecords, LEFT(PunchRecords, CHARINDEX(';',CAST(PunchRecords AS VARCHAR(MAX))+';')-1),
		STUFF(CAST(PunchRecords AS VARCHAR(MAX)), 1, CHARINDEX(';',CAST(PunchRecords AS VARCHAR(MAX))+';'), ''),Status,LeaveType,LeaveStatus
	from tmp
	where PunchRecords > ''
	)
	select SNo,EmpId, EmpName,DeptName,AttendanceDate,Shift,InTime, OutTime,Duration,TotalMinuteDiff,convert(char(5),cast(cast(TotalMinuteDiff as integer)/60 as varchar)+':'+CAST(cast(TotalMinuteDiff as integer)%60 as varchar),108) as 'TotalHrs',ReportPunchRecords,SinglePunch,Status,LeaveType,LeaveStatus 
	INTO #Result116Present
	from tmp
	OPTION (maxrecursion 0)

	select  DISTINCT SNo,EmpId,EmpName,DeptName,AttendanceDate,Shift, InTime, OutTime,cast(ReportPunchRecords as nvarchar(max))as 'Punch Records', 


	convert(char(5),cast(cast(sum(TimeDifference) over (partition by EmpId,SNo) as integer)/60 as varchar)+':'+CAST(cast(sum(TimeDifference) over (partition by EmpId,SNo) as integer)%60 as varchar),108) as 'InDur',
	convert(char(5),cast(cast(TotalMinuteDiff-sum(TimeDifference) over (partition by EmpId,SNo) as integer)/60 as varchar)+':'+CAST(cast(TotalMinuteDiff-sum(TimeDifference) over (partition by EmpId,SNo) as integer)%60 as varchar),108) as 'OutDur',
TotalHrs,

	Status,LeaveType,LeaveStatus  from (SELECT SNo,
		EmpId,EmpName,DeptName,AttendanceDate,Shift, InTime, OutTime,Duration,TotalMinuteDiff,TotalHrs, ReportPunchRecords,SinglePunch,
		SUBSTRING(SinglePunch, 0, 6) AS 'InTimes',
		SUBSTRING(SinglePunch, 11, 5) AS 'OutTimes',
		--DATEDIFF (MINUTE,CAST(SUBSTRING(SinglePunch, 0, 6) as Time),CAST(SUBSTRING(SinglePunch, 11, 5) AS TIME)) AS 'TimeDifference',
		CASE WHEN  CAST(SUBSTRING(SinglePunch, 0, 6) as Time)> CAST(SUBSTRING(SinglePunch, 11, 5) AS TIME) THEN  
	 DATEDIFF (MINUTE,CAST(SUBSTRING(SinglePunch, 0, 6) as datetime),DateAdd(day,1,CAST(SUBSTRING(SinglePunch, 11, 5) AS datetime)))
	 ELSE DATEDIFF (MINUTE,CAST(SUBSTRING(SinglePunch, 0, 6) as Time),CAST(SUBSTRING(SinglePunch, 11, 5) AS TIME)) END AS 'TimeDifference',
		Status,LeaveType,LeaveStatus
	FROM 
	#Result116Present) as q2  
DROP TABLE #Result116Present  
DROP TABLE #ResultPresent119





EmpId	EmpName	SNo	   DeptName	AttendanceDate	Shift	InTime	OutTime	     Punch Records	        InDur	OutDur	TotalHr Status	 LeaveType   LeaveStatus
SS339	Anandhi	1	HUMAN RESOURCES	08-21-2017	General	2:54PM	8:47PM 	2:54PM (in),8:47PM (out)	5:53 	0:0  	5:53 	Present	Sick Leave	Rejected
SS339	Anandhi	2	HUMAN RESOURCES	08-21-2017	General	2:54PM	8:47PM 	2:54PM (in),8:47PM (out)	5:53 	0:0  	5:53 	Present	Sick Leave	Accepted

1 Ответов

Рейтинг:
12

Sigmond Gatt

Чтобы избежать дубликатов, просто использовать отдельную функцию и принято использовать там, где caluse:

выберите distinct foo из таблицы, где status = 'Accepted'.

Я не могу выполнить весь запрос целиком, потому что данных очень много.

Надеюсь, я помог.