ISNULL不工作

时间:2018-03-02 07:03:11

标签: sql-server

我试图获得员工的工资,我不确定为什么ISNULL不在这里工作。虽然在子查询外使用时相同的查询也可以工作。 也许我实现错误的Isnull功能。 即使有基本工资,净工资也显示为零。

 DECLARE @dateFrom datetime
 SET @dateFrom = '2018-03-01'
  DECLARE @dateTo datetime
 SET @dateTo = '2018-03-31'
 Select 
     [Emp].ID
    ,[Emp].EmpCode
    ,[Emp].FirstName + ' ' + [Emp].LastName AS Name
    ,[Emp].BasicPay
        ,((select SUM(InstallmentAmount) from HRM.tbl_EmployeeLoanInstallment [Loan]
       LEFT JOIN HRM.tbl_EmployeeLoan [EmpLoan] ON [EmpLoan].ID = [Loan].EmployeeLoanCode
       where [EmpLoan].EmpCode = Emp.ID AND IsReceived != 1
       AND CONVERT(date, [Loan].InstallmentDueOn) >=  CONVERT(date, @dateFrom)
    AND CONVERT(date, [Loan].InstallmentDueOn) <=  CONVERT(date, @dateTo))) AS LoanDeduction
    ,( SELECT 
        (ISNULL([Info].[BasicPay], 0))

        -
        (SELECT SUM(ISNULL([Loan].InstallmentAmount, 0))            
                    FROM [HRM].[tbl_EmployeeLoan] [EmpLoan]

                    FULL JOIN [HRM].[tbl_EmployeeInfo] [Info] ON [Info].[ID] = [EmpLoan].[EmpCode]
                    FULL JOIN [HRM].[tbl_EmployeeLoanInstallment] [Loan] ON [EmpLoan].[ID] = [Loan].[EmployeeLoanCode]
                    WHERE
                        CONVERT(date, [Loan].InstallmentDueOn) >=  CONVERT(date, @dateFrom)
                        AND 
                        CONVERT(date, [Loan].InstallmentDueOn) <=  CONVERT(date, @dateTo)
                        AND
                        [Info].[ID] = [Emp].[ID]

                    GROUP BY Info.ID)

    FROM  
    [HRM].[tbl_EmployeeInfo] [Info]

    WHERE Info.ID = Emp.ID
    GROUP BY [Info].[ID], [Info].[BasicPay]
) AS NetSalary

    from HRM.tbl_EmployeeInfo [Emp]

输出:

412 C3-345  Ayesha Fatima   20000.00    NULL        NULL
413 C3-651  Zainab Ali      20000.00    NULL        NULL
414 C1343   Ahmed Abdullah  20000.00    11111.11    8888.89
415 231     Ahmed  Aslam    20000.00    NULL        NULL
416 FS-16   Fawaz Aslam     25000.00    NULL        NULL

1 个答案:

答案 0 :(得分:1)

您确定子查询返回值吗?似乎并非如此。 如果你真的想要一个值,你应该在子查询的末尾捕获空值。

,ISNULL(
( SELECT 
        (ISNULL([Info].[BasicPay], 0))

        -
        (SELECT SUM(ISNULL([Loan].InstallmentAmount, 0))            
                    FROM [HRM].[tbl_EmployeeLoan] [EmpLoan]

                    FULL JOIN [HRM].[tbl_EmployeeInfo] [Info] ON [Info].[ID] = [EmpLoan].[EmpCode]
                    FULL JOIN [HRM].[tbl_EmployeeLoanInstallment] [Loan] ON [EmpLoan].[ID] = [Loan].[EmployeeLoanCode]
                    WHERE
                        CONVERT(date, [Loan].InstallmentDueOn) >=  CONVERT(date, @dateFrom)
                        AND 
                        CONVERT(date, [Loan].InstallmentDueOn) <=  CONVERT(date, @dateTo)
                        AND
                        [Info].[ID] = [Emp].[ID]

                    GROUP BY Info.ID)
, 0)

    FROM  
    [HRM].[tbl_EmployeeInfo] [Info]