sql查询返回null,但应该返回一个值

问题描述 投票:0回答:1

我有这样的疑问:

amount列存储的数据,类型为:decimal(12,2),sum2/expenses为负值,另外两个为正值。

SELECT sum1 + sum2 - sum3
FROM (SELECT sum(amount) as sum1 FROM economy_transactions WHERE MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '1' AND type = 'income') x CROSS JOIN
     (SELECT sum(amount) as sum2 FROM economy_transactions WHERE MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '1' AND type = 'expense') y CROSS JOIN
     (SELECT sum(amount) as sum3 FROM economy_transactions WHERE MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '1' AND type = 'transfer') z;

如果只有一个子查询返回 NULL,即使其中一个或两个返回值,它也会返回 NULL。

即使我在一个、两个或所有子查询上得到 NULL 值,我怎样才能使计算工作。

我尝试添加

.. WHERE amount IS NOT NULL ..
像这样:

SELECT sum1 + sum2 - sum3
FROM (SELECT sum(amount) as sum1 FROM economy_transactions WHERE amount IS NOT NULL AND MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '2' AND type = 'income') x CROSS JOIN
     (SELECT sum(amount) as sum2 FROM economy_transactions WHERE amount IS NOT NULL AND MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '2' AND type = 'expense') y CROSS JOIN
     (SELECT sum(amount) as sum3 FROM economy_transactions WHERE amount IS NOT NULL AND MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '2' AND type = 'transfer') z;

但是没有什么区别。我仍然得到与没有相同的结果。

在我提出上面的查询之前,我这样做了。这工作得很好,但我必须随后用 PHP 进行计算。

SELECT SUM(amount) FROM economy_transactions WHERE MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '1' AND type = 'income'
UNION
SELECT SUM(amount) FROM economy_transactions WHERE MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '1' AND type = 'expense'
UNION
SELECT SUM(amount) FROM economy_transactions WHERE MONTH(date) = '7' AND YEAR(date) = '2024' AND account_source = '1' AND type = 'transfer';

如有任何建议,我们将不胜感激。

sql math sum
1个回答
0
投票

如果对某个值添加或减去 NULL,则结果本身将为 NULL。在表达式中,您需要将任何空值转换为零以防止这种情况发生。例如在 SQL Server 中:

SELECT ISNULL(sum1, 0) + ISNULL(sum2, 0) - ISNULL(sum3, 0)

对于 MySQL 使用 IFNULL,如果使用 Oracle,则使用 NVL。

© www.soinside.com 2019 - 2024. All rights reserved.