SQL:总和3列时,一列有一个空值?

SELECT sum(TotalHoursM) + (TotalHoursT) + (TotalHoursW) + (TotalHoursTH) + (TotalHoursF) AS TOTAL FROM LeaveRequest 

如果列有一个0值,那么你很好,我的猜测是你有一个Null值的问题,在这种情况下,你需要使用IsNull(Column, 0)来确保它始终为0。

以前使用ISNULL函数的答案是正确的。 COALESCEfunction也将起作用。 在给出的例子中:

 SELECT sum(COALESCE(TotalHoursM,0)) + COALESCE(TotalHoursT,0) + COALESCE(TotalHoursW,0) + COALESCE(TotalHoursTH,0) + COALESCE(TotalHoursF,0) AS TOTAL FROM LeaveRequest 

这与ISNULL解决scheme完全相同,唯一的区别是function的名称。 在SQL世界里有一些分歧是“更好”的。 但是这两个工作。 我提交这个select有两个原因。 COALESCE是ANSI标准, ISNULL不是。 但是,更重要的是COALESCE更灵活。 ISNULL只能使用两个参数。 如果第一个参数是NULL,则返回第二个参数的值,否则返回第一个参数的值。 COALESCE将采取2到'n'(我不知道'n'的限制)参数,并返回非NULL的第一个参数的NULL 。 当只有两个参数时,效果与ISNULL相同。

 SELECT sum(isnull(TotalHoursM,0)) + isnull(TotalHoursT,0) + isnull(TotalHoursW,0) + isnull(TotalHoursTH,0) + isnull(TotalHoursF,0) AS TOTAL FROM LeaveRequest 

仅供参考,MySQL的等价语句是:IFNull(Column,0) 。

如果该列的值不为空,则该语句评估为列值,否则评估为0。

你可以使用ISNULL

 ISNULL(field, VALUEINCASEOFNULL) 

看起来像你想汇总所有的列(我不知道“总和3列”来自哪里),不只是TotalHoursM,所以试试这个:

 SELECT SUM( ISNULL(TotalHoursM ,0) + ISNULL(TotalHoursT ,0) + ISNULL(TotalHoursW ,0) + ISNULL(TotalHoursTH ,0) + ISNULL(TotalHoursF ,0) ) AS TOTAL FROM LeaveRequest 

我会试试这个:

 select sum (case when TotalHousM is null then 0 else TotalHousM end) + (case when TotalHousT is null then 0 else TotalHousT end) + (case when TotalHousW is null then 0 else TotalHousW end) + (case when TotalHousTH is null then 0 else TotalHousTH end) + (case when TotalHousF is null then 0 else TotalHousF end) as Total From LeaveRequest 

如果要避免使用空值,请使用IsNull(Column,1)

你也可以使用nvl(Column,0)