我有这样的疑问:
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';
如有任何建议,我们将不胜感激。
如果对某个值添加或减去 NULL,则结果本身将为 NULL。在表达式中,您需要将任何空值转换为零以防止这种情况发生。例如在 SQL Server 中:
SELECT ISNULL(sum1, 0) + ISNULL(sum2, 0) - ISNULL(sum3, 0)
对于 MySQL 使用 IFNULL,如果使用 Oracle,则使用 NVL。