在使用SUM的SQL查询中处理NULL值

问题:

我试图在VBA(Excel)中执行一个包含使用SUM例如计算的查询

Select SUM(field1) - SUM(field2) as 'newField' from y

如果没有空值或空字段,那么代码完美的工作,但只要我有一个null /空值field1或field2然后返回一个空白。

所以如果SUM(field1) = 17 and SUM(field2) = null我想查看返回17而不是一个空白值。

代码:

 Public Function GetRiskRecords(ByVal strPrgNo As String) As Variant Dim strSQL As String strSQL = "Select [tblRiskMitigating$].RiskID, [tblRiskMitigating$].Program_No, [tblRiskMain$].RiskID, [tblRiskMain$].Program_No, [tblRiskMain$].Department, [tblRiskMain$].DateAdded, [tblRiskMain$].OwnerID, [tblRiskMain$].Description, " _ & " [tblRiskMain$].RiskTo, [tblRiskMain$].Probability, " _ & " Sum([tblRiskMain$].ScheduleImpact) - Sum([tblRiskMitigating$].ScheduleReduction) as 'NewScheduleImpact', " _ & " Sum([tblRiskMain$].CostImpact) - Sum([tblRiskMitigating$].CostReduction) as 'NewCostImpact'" _ & " From [tblRiskMain$]" _ & " Left Join [tblRiskMitigating$] on [tblRiskMain$].RiskID = [tblRiskMitigating$].RiskID AND [tblRiskMain$].Program_No = [tblRiskMitigating$].Program_No" _ & " Where [tblRiskMain$].Program_No = '" & strPrgNo & "'" _ & " Group By [tblRiskMitigating$].RiskID, [tblRiskMitigating$].Program_No, [tblRiskMain$].RiskID, [tblRiskMain$].Program_No, [tblRiskMain$].Department, [tblRiskMain$].DateAdded, [tblRiskMain$].OwnerID, [tblRiskMain$].Description, " _ & " [tblRiskMain$].RiskTo, [tblRiskMain$].Probability" Call Open_Conn(strDb) Call Open_RS(strSQL) If rs.EOF Then Debug.Print ("Error: no records") Else GetRiskRecords = rs.GetRows End If Call Close_RS Call Close_Conn End Function 

的背景:

我已经做了一些挖掘,并尝试在开始时添加isnull和iif,但是我一直没有能够得到这些工作(所以我已经从问题中省略了它们,以减less从我原来的(主)问题)。

你可以使用ISNULL/COALESCE

 Select SUM(ISNULL(field1,0)) - SUM(ISNULL(field2,0)) as 'newField' from y; 

甚至合并成一个SUM

 Select SUM(ISNULL(field1,0) - ISNULL(field2,0)) as 'newField' from y; 

如果ISNULL/COALESCE可以方便地与CASE WHENIIFSQL Server 2012+SQL Server 2012+

 CASE WHEN field1 IS NULL THEN 0 ELSE field1 END; IIF(field1 IS NULL, 0, field1); 

编辑:

上面的代码是面向SQL Server的,对于EXCEL你应该使用:

 SELECT SUM(IIF(field1 IS NULL, 0, field1) - IIF(field2 IS NULL, 0 field2)) FROM y