Почему сумма в запросе к базе данных дает NULL - PullRequest
0 голосов
/ 08 октября 2018

Предположим, у меня есть таблица с названием "Расходы", и у нее есть месячные расходы, которые могут содержать некоторое значение "NULL", теперь я хочу проверить годовые расходы в целом с помощью этого запроса ниже: -

enter image description here

Select Sum(January) + Sum (February) ..... (I skipped the rest 10 months)
from Expense 

Это дает результат как "NULL"

Как мне избежать этой ситуации?Я думаю, что есть более удобный способ проверить годовую сумму

Ответы [ 7 ]

0 голосов
/ 08 октября 2018

То есть, поскольку у вас есть NULL значения, вы можете использовать Case, Coalesce или IIF:

Select SUM(IIF(Col IS NULL, 0, Col))

Select SUM(CASE WHEN Col IS NULL THEN 0 ELSE Col END)

Select COALESCE(Sum(Col), 0)
0 голосов
/ 08 октября 2018

Любая арифметическая функция вернет ноль, если в данном столбце есть хотя бы одно нулевое значение.Вот почему вы должны использовать такие функции, как coalesce или isNull (MSSQL), NVL (Oracle).

0 голосов
/ 08 октября 2018

Вы можете использовать ISNULL(SUM(January),0).

0 голосов
/ 08 октября 2018

Поскольку значение null + всегда равно нулю, а в вашей выборке суммы за несколько месяцев равны нулю, вы можете избежать этого, добавив ISNULL

Select isnull(Sum(January),0) + 
    isnull(Sum(February),0) 
--..... (I skipped the rest 10 months)
from Expense 

В качестве альтернативы вы можете использовать следующий способ:

Select Sum(
    isnull(January,0) + 
    isnull(February,0) 
    )
--..... (I skipped the rest 10 months)
from Expense 
0 голосов
/ 08 октября 2018

Все арифметические или логические операции с NULL приводят к NULL.Например:

SELECT 1 + NULL -- NULL

Необходимо преобразовать NULL в нули, прежде чем вы сможете + их:

SELECT
    COALESCE(SUM(January), 0) +
    COALESCE(SUM(February) , 0) +
    ...

Также можно сначала добавить столбцы, а затем вычислить сумму:

SELECT SUM(
    COALESCE(January, 0) +
    COALESCE(February, 0) +
)

Имейте в виду, что (i) SUM пропускает значения NULL (ii) возвращает NULL вместо 0, если все значения NULL:

SELECT SUM(a) FROM (VALUES
    (1),
    (2),
    (NULL)
) AS v(a) -- returns 3 instead of NULL

Возвращается NULL, если все значения были равны NULL:

SELECT SUM(a) FROM (VALUES
    (CAST(NULL AS INT)),
    (NULL),
    (NULL)
) AS v(a) -- returns NULL instead of 0
0 голосов
/ 08 октября 2018

Просто используйте coalesce [ с 0 в качестве второго аргумента ], чтобы заменить пустые значения для всех столбцов месяца, иначе вы не сможете получить истинные результаты от агрегации числовых значений:

select sum(coalesce(January,0)+coalesce(February,0) ... )
  from Expense
0 голосов
/ 08 октября 2018

используйте функцию coalesce для преобразования нуля в 0, затем используйте сумму

Select Sum(coalesce(January,0)) + Sum (coalesce(February,0)) ..... (I skipped the rest 10 months)
from Expense
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...