DeanKlos
DeanKlos

Reputation: 15

Using a CASE WHEN expression to a scalar function - T-SQL

I have a scalar valued function below but want to add a CASE WHEN expression but so far have failed to get the syntax right.

USE [MYDatabaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[leaveBalanceByEmployeeID] (@EmployeeID INT)
RETURNS decimal(10,1)
AS
BEGIN
  DECLARE @returnValue decimal(10,1)
 SELECT @returnValue = MIN(dbo.LeaveMaster.LeaveDaysCarriedFoward + dbo.MonthsInService(dbo.LeaveMaster.DaysCarriedFowardCutoffDate, GETDATE()) 
            * dbo.EmployeeTypes.MonthlyLeaveAssignment)  - (SELECT     ISNULL(SUM(ActualLeaveDaysTaken), 0) AS LV
           FROM  dbo.LeaveApplications
           WHERE (EmployeeRecordID = dbo.EmployeeMaster.id AND HRMApproval = 'True' AND MarkAsDeleted = 'False'))  - CASE WHEN 0 <
           (SELECT ISNULL(SUM(DaysAuthorised),0) AS ECL
           FROM  dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_2
           WHERE (MasterEmployeeID = dbo.EmployeeMaster.id AND YEAR(CompassionateLeaveApplications_2.AuthorisedFromDate) =YEAR(GETDate())))  - ISNULL(MAX(dbo.Districts.CompassionateDays),0) THEN
           (SELECT  ISNULL(SUM(DaysAuthorised),0) AS ECL
           FROM   dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_2
           WHERE  (MasterEmployeeID = dbo.EmployeeMaster.id) AND YEAR(CompassionateLeaveApplications_2.AuthorisedFromDate) =YEAR(GETDate())) - ISNULL(MAX(dbo.Districts.CompassionateDays),0) ELSE 0 END                                                     
FROM       dbo.EmployeeMaster Full outer join dbo.LeaveMaster ON dbo.EmployeeMaster.id = dbo.LeaveMaster.EmpRecordID Full outer join
                      dbo.EmployeeTypes ON dbo.EmployeeMaster.EmployeeType = dbo.EmployeeTypes.ID Full outer join
                      Human_Resources.Departments ON dbo.EmployeeMaster.DepartmentId = Human_Resources.Departments.DepartmentID Full outer join
                      dbo.StaffHomeAddresses ON dbo.EmployeeMaster.id = dbo.StaffHomeAddresses.StaffID Full outer join
                      dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_1 ON 
                      dbo.EmployeeMaster.id = CompassionateLeaveApplications_1.MasterEmployeeID Full outer join
                      dbo.Districts ON dbo.StaffHomeAddresses.District = dbo.Districts.DistrictID
                      WHERE    dbo.EmployeeMaster.id = @EmployeeID
GROUP BY dbo.EmployeeMaster.id
return @returnValue
END

Now table dbo.EmployeeMaster has a bit column named IsActive. What i want to achieve is if IsActive column = True then @returnValue should return what the query above will return else if IsActive = False, then i want to just return 0.0

Upvotes: 0

Views: 122

Answers (2)

Santiago Regojo
Santiago Regojo

Reputation: 405

Just initialize the variable with the desired value if not active:

DECLARE @returnValue decimal(10,1) = 0.0

Modify your Where calusule to check if active

 WHERE    dbo.EmployeeMaster.id = @EmployeeID and dbo.EmployeeMaster.IsActive = 1

By adding that condition the variable is going to be updated only if active, in another case it'll cointain the value you used in the initialization.

USE [MYDatabaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[leaveBalanceByEmployeeID] (@EmployeeID INT)
RETURNS decimal(10,1)
AS
BEGIN
  DECLARE @returnValue decimal(10,1) = 0.0
 SELECT @returnValue = MIN(dbo.LeaveMaster.LeaveDaysCarriedFoward + dbo.MonthsInService(dbo.LeaveMaster.DaysCarriedFowardCutoffDate, GETDATE()) 
            * dbo.EmployeeTypes.MonthlyLeaveAssignment)  - (SELECT     ISNULL(SUM(ActualLeaveDaysTaken), 0) AS LV
           FROM  dbo.LeaveApplications
           WHERE (EmployeeRecordID = dbo.EmployeeMaster.id AND HRMApproval = 'True' AND MarkAsDeleted = 'False'))  - CASE WHEN 0 <
           (SELECT ISNULL(SUM(DaysAuthorised),0) AS ECL
           FROM  dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_2
           WHERE (MasterEmployeeID = dbo.EmployeeMaster.id AND YEAR(CompassionateLeaveApplications_2.AuthorisedFromDate) =YEAR(GETDate())))  - ISNULL(MAX(dbo.Districts.CompassionateDays),0) THEN
           (SELECT  ISNULL(SUM(DaysAuthorised),0) AS ECL
           FROM   dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_2
           WHERE  (MasterEmployeeID = dbo.EmployeeMaster.id) AND YEAR(CompassionateLeaveApplications_2.AuthorisedFromDate) =YEAR(GETDate())) - ISNULL(MAX(dbo.Districts.CompassionateDays),0) ELSE 0 END                                                     
FROM       dbo.EmployeeMaster Full outer join dbo.LeaveMaster ON dbo.EmployeeMaster.id = dbo.LeaveMaster.EmpRecordID Full outer join
                      dbo.EmployeeTypes ON dbo.EmployeeMaster.EmployeeType = dbo.EmployeeTypes.ID Full outer join
                      Human_Resources.Departments ON dbo.EmployeeMaster.DepartmentId = Human_Resources.Departments.DepartmentID Full outer join
                      dbo.StaffHomeAddresses ON dbo.EmployeeMaster.id = dbo.StaffHomeAddresses.StaffID Full outer join
                      dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_1 ON 
                      dbo.EmployeeMaster.id = CompassionateLeaveApplications_1.MasterEmployeeID Full outer join
                      dbo.Districts ON dbo.StaffHomeAddresses.District = dbo.Districts.DistrictID
                      WHERE    dbo.EmployeeMaster.id = @EmployeeID and dbo.EmployeeMaster.IsActive = 1 
GROUP BY dbo.EmployeeMaster.id
return @returnValue
END

Upvotes: 0

Raj
Raj

Reputation: 10853

Why not add an IF-ELSE construct and query accordingly, like this?

USE [MYDatabaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[leaveBalanceByEmployeeID] (@EmployeeID INT)
RETURNS decimal(10,1)
AS
BEGIN
  DECLARE @returnValue decimal(10,1),@isActive bit;
  SELECT @isActive = IsActive FROM dbo.EmployeeMaster WHERE id = @EmployeeID;
  IF @isActive = 1
  BEGIN
  SELECT @returnValue = MIN(dbo.LeaveMaster.LeaveDaysCarriedFoward + dbo.MonthsInService(dbo.LeaveMaster.DaysCarriedFowardCutoffDate, GETDATE()) 
            * dbo.EmployeeTypes.MonthlyLeaveAssignment)  - (SELECT     ISNULL(SUM(ActualLeaveDaysTaken), 0) AS LV
           FROM  dbo.LeaveApplications
           WHERE (EmployeeRecordID = dbo.EmployeeMaster.id AND HRMApproval = 'True' AND MarkAsDeleted = 'False'))  - CASE WHEN 0 <
           (SELECT ISNULL(SUM(DaysAuthorised),0) AS ECL
           FROM  dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_2
           WHERE (MasterEmployeeID = dbo.EmployeeMaster.id AND YEAR(CompassionateLeaveApplications_2.AuthorisedFromDate) =YEAR(GETDate())))  - ISNULL(MAX(dbo.Districts.CompassionateDays),0) THEN
           (SELECT  ISNULL(SUM(DaysAuthorised),0) AS ECL
           FROM   dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_2
           WHERE  (MasterEmployeeID = dbo.EmployeeMaster.id) AND YEAR(CompassionateLeaveApplications_2.AuthorisedFromDate) =YEAR(GETDate())) - ISNULL(MAX(dbo.Districts.CompassionateDays),0) ELSE 0 END                                                     
  FROM       dbo.EmployeeMaster Full outer join dbo.LeaveMaster ON dbo.EmployeeMaster.id = dbo.LeaveMaster.EmpRecordID Full outer join
                      dbo.EmployeeTypes ON dbo.EmployeeMaster.EmployeeType = dbo.EmployeeTypes.ID Full outer join
                      Human_Resources.Departments ON dbo.EmployeeMaster.DepartmentId = Human_Resources.Departments.DepartmentID Full outer join
                      dbo.StaffHomeAddresses ON dbo.EmployeeMaster.id = dbo.StaffHomeAddresses.StaffID Full outer join
                      dbo.CompassionateLeaveApplications AS CompassionateLeaveApplications_1 ON 
                      dbo.EmployeeMaster.id = CompassionateLeaveApplications_1.MasterEmployeeID Full outer join
                      dbo.Districts ON dbo.StaffHomeAddresses.District = dbo.Districts.DistrictID
                      WHERE    dbo.EmployeeMaster.id = @EmployeeID
GROUP BY dbo.EmployeeMaster.id
END
ELSE 
BEGIN
SET @returnValue = 0;
END
return @returnValue
END

Upvotes: 1

Related Questions