Click here to Skip to main content
15,896,557 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
I'm trying to display the total worked hours and total permission hours approved for each employee in a specific month, I try this sql query but, if one of the employee doesn't have permisions in a specific month the system doesn't display this employee, i want that even if the employee doesn't have permission, the system display this employee with permissionhours = 0

SQL
<pre lang="sql">SELECT  MST_EMPLOYEE.[ID] as ID
      ,[EMPCODE]

      ,[EMPFNAME]+' '+[EMPMNAME]+' '+[EMPLNAME] AS EMPNAME
     ,(SELECT DESIGNATION FROM MST_DESIGNATION WHERE ID=
     (SELECT TOP(1) DESIGNATIONID FROM EMP_PROFESSIONALDETAILS WHERE EMPID=MST_EMPLOYEE.ID ORDER BY HIREDATE DESC)) AS DESIGNATION
    , min(Times_IN) as TimeIn , max(Times_Out) as TimeOut,
    ( select count (distinct _Date)  from Emp_Attendance  where  month (_date)= 6  and EmpID = MST_EMPLOYEE.[ID] ) as WorkedDays
    ,(select CONVERT(varchar(3),SUM(DATEDIFF(MINUTE, Times_In, Times_Out)) / 60)
     +':' +  RIGHT('0' + CONVERT(varchar(2),SUM(DATEDIFF(MINUTE, Times_In, Times_Out)) % 60),2)
      from Emp_Attendance where month (_date)= 6 and EmpID = MST_EMPLOYEE.[ID] )
     as TotalWorkedHours
     ,
     (select  CONVERT(varchar(3),SUM(DATEDIFF(MINUTE, StartTime, EndTime)) / 60)
     +':' +  RIGHT('0' + CONVERT(varchar(2),SUM(DATEDIFF(MINUTE, StartTime, EndTime)) % 60),2)
from Emp_PermissionsRequest where MONTH(_Date) = 6 and EmployeeID = MST_EMPLOYEE.[ID] )

as TotalPermissionHours

  FROM [MST_EMPLOYEE] inner join Emp_Attendance on Emp_Attendance.EmpID=MST_Employee.ID --group by MST_Employee.EmpFName
  inner join Emp_PermissionsRequest on Emp_PermissionsRequest.EmployeeID=MST_Employee.ID

 where month(Times_IN) = 6
 group by MST_Employee.ID, MST_Employee.EmpCode, EmpFName, EmpMName, EmpLName
Posted
Updated 11-Jun-15 5:41am
v3
Comments
F-ES Sitecore 11-Jun-15 11:54am    
Your query is hard to follow, but at a basic guess I'd try changing your "inner join" types to "left join" and go from there. A left join will keep a row for one part of the join even if the other part has to corresponding data. That "missing" part has NULL for each column value.
CHill60 11-Jun-15 16:07pm    
Worth posting as a solution
Member 10286520 11-Jun-15 11:56am    
thanks a lot F-ES Sitecore it workes successfully :)
ZurdoDev 11-Jun-15 12:01pm    
Reply to the comment so that the user is notified.

1 solution

SQL
<pre lang="sql">SELECT  MST_EMPLOYEE.[ID] as ID
      ,[EMPCODE]

      ,[EMPFNAME]+' '+[EMPMNAME]+' '+[EMPLNAME] AS EMPNAME
     ,(SELECT DESIGNATION FROM MST_DESIGNATION WHERE ID=
     (SELECT TOP(1) DESIGNATIONID FROM EMP_PROFESSIONALDETAILS WHERE EMPID=MST_EMPLOYEE.ID ORDER BY HIREDATE DESC)) AS DESIGNATION
    , min(Times_IN) as TimeIn , max(Times_Out) as TimeOut,
    ( select count (distinct _Date)  from Emp_Attendance  where  month (_date)= 6  and EmpID = MST_EMPLOYEE.[ID] ) as WorkedDays
    ,(select CONVERT(varchar(3),SUM(DATEDIFF(MINUTE, Times_In, Times_Out)) / 60)
     +':' +  RIGHT('0' + CONVERT(varchar(2),SUM(DATEDIFF(MINUTE, Times_In, Times_Out)) % 60),2)
      from Emp_Attendance where month (_date)= 6 and EmpID = MST_EMPLOYEE.[ID] )
     as TotalWorkedHours
     ,
     (select  CONVERT(varchar(3),SUM(DATEDIFF(MINUTE, StartTime, EndTime)) / 60)
     +':' +  RIGHT('0' + CONVERT(varchar(2),SUM(DATEDIFF(MINUTE, StartTime, EndTime)) % 60),2)
from Emp_PermissionsRequest where MONTH(_Date) = 6 and EmployeeID = MST_EMPLOYEE.[ID] )

as TotalPermissionHours

  FROM [MST_EMPLOYEE] left join Emp_Attendance on Emp_Attendance.EmpID=MST_Employee.ID --group by MST_Employee.EmpFName
  left join Emp_PermissionsRequest on Emp_PermissionsRequest.EmployeeID=MST_Employee.ID

 where month(Times_IN) = 6
 group by MST_Employee.ID, MST_Employee.EmpCode, EmpFName, EmpMName, EmpLName
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900