SUM 一列然后减去另一列的 SUM

SUM a column then SUBTRACT to the SUM of another column

我有一个 table 具有以下字段:

EmpID,
Code,
Amount,
TransDate,
CM,
CMDate

我想要获取数据网格的是 SUM 所有具有相同 CodeSUMCMAmount CodeAmount 相同,然后将 SUM(Amount) 减去 SUM(CM),但如果结果为 NULL(例如,没有 CM求和并减去 SUM(Amount)) 然后它只需要 select SUM(Amount)。我想出了这个声明:

SELECT
    TransDate, 
    Code, 
    SUM(Amount) - SUM(CM) AS 'Result'
FROM DeductionTbl
WHERE 
    (EmpID = @empID)
GROUP BY Code, TransDate
ORDER BY TransDate

如果有 SUM(CM) 减去 SUM(Amount),我得到结果值,但如果没有 SUM(CM),我得到结果 NULL 值相同 Code。我不想要数据网格上的 NULL 值。如果有 NULL 值只是 return SUM(Amount)。有没有办法做到这一点?谢谢!

试试这个,在这种情况下,IsNull 将 NULLS 转换为零。

SELECT
    TransDate, 
    Code, 
    SUM(Amount) - SUM(ISNULL(CM, 0)) AS 'Result'
FROM DeductionTbl
WHERE 
    (EmpID = @empID)
GROUP BY Code, TransDate
ORDER BY TransDate

使用 ISNULLs:

SELECT
    TransDate, 
    Code, 
    isnull(SUM(isnull(Amount,0)),0) - isnull(SUM(isnull(CM,0)),0) AS 'Result'
FROM DeductionTbl
WHERE 
    (EmpID = @empID)
GROUP BY Code, TransDate
ORDER BY TransDate

NOTE:

The SUM(ISNULL(CM,0)) may return NULL when running query on an empty result set also it avoid the ANSI WARNINGS about aggregating NULL.

And ISNULL(SUM(CM),0) is not regarded as nullable.

任何使用空值的操作通常都会产生空值。您需要将空值作为 0 处理。为此我们使用 ISNULL 函数。
试试这个...

SELECT
TransDate, 
Code, 
SUM(Amount) - ISNULL(SUM(CM), 0) AS 'Result'
FROM DeductionTbl
WHERE 
(EmpID = @empID)
GROUP BY Code, TransDate
ORDER BY TransDate