Я думаю, вы хотите что-то вроде этого:
SELECT COALESCE(t1.sum_number1_column, 0) -
COALESCE(t2.sum_number2_column, 0)
FROM (SELECT SUM(number1_column) as sum_number1_column
FROM table1_name
WHERE date1_column >= datefromparts(year(getdate()), month(getdate()), 1) AND
date1_column < dateadd(month, 1, datefromparts(year(getdate()), month(getdate()), 1))
) t1 CROSS JOIN
(SELECT SUM(number2_column) as sum_number2_column
FROM table2_name
WHERE date2_column >= datefromparts(year(getdate()), month(getdate()), 1) AND
date2_column < dateadd(month, 1, datefromparts(year(getdate()), month(getdate()), 1))
) t2;
Этот ответ состоит из нескольких частей.
Сначала подзапросы перемещаются в предложение FROM
. На самом деле это удобно для обработки значений NULL
. Каждый подзапрос будет возвращать ровно одну строку, даже если ни одна строка не соответствует предложению WHERE
.
Во-вторых, это обрабатывает NULL
значения, которые возвращаются, поскольку в базовых таблицах нет строк. Ваша версия этого не делает. NULL
необходимо обработать после возврата подзапроса. Я нахожу это проще с COALESCE()
в SELECT
.
В-третьих, арифметика даты использует datefromparts()
, очень удобную функцию SQL Server. Это означает, что нет никаких загадочных преобразований даты. И полученный код может использовать индекс по столбцу даты.