对具有可空值的多列进行求和

时间:2015-07-21 13:43:10

标签: sql sql-server

我必须编辑一个存储过程,该存储过程必须返回具有可空值的三列的总和。如果有null值,我需要将其转换为0

以下是数据的屏幕截图:

enter image description here

以下是仅使用第一列的原始请求:

SELECT SUM(reglProj.Montant) /* SUM of 'Montant', 'FraisMagasing', 'FraisVendeur' instead */ AS SommeReglement
FROM Projet.LigneEcheancierProjet ligne
INNER JOIN Projet.ReglementProjetEcheance reglProj ON reglProj.LigneEcheancierProjetId = ligne.LigneEcheancierProjetId
....

您是否在T-SQL中使用sumcase条件获得了一些最佳做法?

3 个答案:

答案 0 :(得分:2)

--ANSI standard
    SELECT SUM(COALESCE(col1,0)) + SUM(COALESCE(col2,0)) + SUM(COALESCE(col3,0))

--SQL Server Style    
    SELECT SUM(ISNULL(col1,0)) + SUM(ISNULL(col2,0)) + SUM(ISNULL(col3,0))

--The one wthout functions. It will work the same as previous OR FASTER.    
    SELECT SUM(CASE WHEN col1 IS NULL THEN 0 ELSE col1 END) + SUM(CASE WHEN col2 IS NULL THEN 0 ELSE col2 END) + SUM(CASE WHEN col3 IS NULL THEN 0 ELSE col3 END)

为自己选择一个。

或者您可能需要关注(如果您想按行添加总和):

--ANSI standard
    SELECT SUM(COALESCE(col1,0) +COALESCE(col2,0) + COALESCE(col3,0))

--SQL Server Style    
    SELECT SUM(ISNULL(col1,0)+ ISNULL(col2,0) + ISNULL(col3,0))

--The one wthout functions. It will work the same as previous OR FASTER.    
    SELECT SUM(CASE WHEN col1 IS NULL THEN 0 ELSE col1 END + CASE WHEN col2 IS NULL THEN 0 ELSE col2 END + CASE WHEN col3 IS NULL THEN 0 ELSE col3 END)

答案 1 :(得分:1)

在Sql Server中,(并且可能在大多数(如果不是所有)关系数据库中)默认情况下为SUM聚合函数ignores null values,因此实际上不需要使用coalesce或{{在它里面。}

如果你想要每一行的所有3列的总和,那么你需要使用isnull:

SELECT ISNULL(reglProj.Montant,0) + 
       ISNULL(reglProj.FraisMagasing ,0) + 
       ISNULL(reglProj.FraisVendeur,0)
FROM Projet.LigneEcheancierProjet ligne
INNER JOIN Projet.ReglementProjetEcheance reglProj 
      ON reglProj.LigneEcheancierProjetId = ligne.LigneEcheancierProjetId

如果您需要所有3列的汇总总和,您可以这样做:

SELECT ISNULL(SUM(reglProj.Montant), 0) + 
       ISNULL(SUM(reglProj.FraisMagasing), 0) + 
       ISNULL(SUM(reglProj.FraisVendeur), 0)
FROM Projet.LigneEcheancierProjet ligne
INNER JOIN Projet.ReglementProjetEcheance reglProj 
      ON reglProj.LigneEcheancierProjetId = ligne.LigneEcheancierProjetId

答案 2 :(得分:0)

您好像正在寻找ISNULL

SELECT SUM( ISNULL(reglProj.Montant,0) + ISNULL(FraisMagasing,0)+ ISNULL(FraisVendeur,0))    AS SommeReglement
FROM Projet.LigneEcheancierProjet ligne
INNER JOIN Projet.ReglementProjetEcheance reglProj ON reglProj.LigneEcheancierProjetId = ligne.LigneEcheancierProjetId