我正在使用此代码:
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
还是其他什么?
答案 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函数中。