SQL Server求和减法可防止出现空结果

时间:2016-09-10 14:30:41

标签: sql sql-server-2008

我正在使用此代码:

SELECT 
    (SELECT SUM(TrnQty) AS Total 
     FROM InventoryTrans 
     WHERE InventoryItemID = (select MAX(InventoryItemID) 
                              from inventorymaster) 
       AND CustomerID = '0') - 
    (SELECT SUM(TrnQty) AS Total 
     FROM InventoryTrans 
     WHERE InventoryItemID = (select MAX(InventoryItemID) 
                              from InventoryMaster) 
       AND CustomerID > '0'
)

如果其中一个的结果为NULL,则我将完全结果为NULL。如果其中一个是空的,我怎么能SUM?我应该使用CASE还是其他什么?

4 个答案:

答案 0 :(得分:3)

这是一种正确的方法

SELECT Sum(CASE 
             WHEN customerid = '0' THEN trnqty 
             ELSE 0 
           END) - Sum(CASE 
                        WHEN customerid > '0' THEN trnqty 
                        ELSE 0 
                      END) AS Total 
FROM   inventorytrans 
WHERE  inventoryitemid = (SELECT Max (inventoryitemid) 
                          FROM   inventorymaster) 

编辑:

我[@GordonLinoff]提供了一个稍微简单的答案版本。条件聚合的使用是正确的,但有一种更简单的编写方式:

SELECT SUM(CASE WHEN it.customerid = '0' THEN it.trnqty 
                WHEN it.customerid > '0' THEN  - it.trnqty 
                ELSE 0
           END) as Total
FROM inventorytrans it
WHERE it.inventoryitemid = (SELECT Max(im.inventoryitemid) 
                            FROM inventorymaster im
                           ) 

答案 1 :(得分:2)

使用

SELECT coalesce(SUM(TrnQty), 0) ...

答案 2 :(得分:1)

您也可以使用

   SELECT ISNULL(SUM(TrnQty),0)...

答案 3 :(得分:0)

只需将现有的内部select语句包装在ISNULL函数中。它很容易实现,你的意图很明确,如果你的SELECT返回一个空值,使用0.

SELECT 
IsNull(
(
   SELECT SUM(TrnQty) AS Total 
   FROM InventoryTrans 
   WHERE InventoryItemID = 
   (
      select MAX (InventoryItemID) from inventorymaster
   ) 
   and CustomerID='0'
),0) - 
IsNull(
(
   SELECT SUM(TrnQty) AS Total 
   FROM InventoryTrans 
   WHERE InventoryItemID = 
   (
      select MAX (InventoryItemID) from InventoryMaster
   ) 
   and CustomerID > '0'
),0)

这是SQL的一个很好的例子,不是真的,但你可以看到如何用IsNull包装select语句是对现有查询的一个小改动,以便为你提供所需的结果。

此查询可以重新编写为基于单个集合的操作,这是我的理由:

SELECT SUM(CASE customerid WHEN '0' THEN -TrnQty ELSE TrnQty END) AS Total 
FROM InventoryTrans 
WHERE InventoryItemID = 
(
   select MAX (InventoryItemID) from inventorymaster
) 

在这个新查询中没有必要检查null(使用IsNull或Coalesce),除非您需要确保最终结果不为null,如果所有TrnQty字段也是null,则此查询将仅返回null空值。如果这对您的逻辑来说是个问题,那么也可以将SUM函数包装在IsNull函数中。