2015-04-10 2 views
1

У меня есть запрос, который работает нормально и выполняет два типа работы: COUNT и SUM.Возвращает NULL вместо 0 при использовании COUNT (столбец) SQL Server

Что-то вроде

select 
    id, 
    Count (contracts) as countcontracts, 
    count(something1), 
    count(something1), 
    count(something1), 
    sum(cost) as sumCost 
from 
    table 
group by 
    id 

Моя проблема заключается: если нет контракта для данного ID, она возвращает 0 для COUNT и Null для SUM. Я хочу видеть нуль, а не 0

Я думал о случае, когда Count (contracts) = 0 then null else Count (contracts) end, но я не хочу этого делать, потому что у меня более 12 позиций подсчета в запросе и его предположения большого количества записей, поэтому я думаю это может замедлить выполнение запросов.

Есть ли другие способы заменить 0 NULL?

+0

ли КТР, заменить на главном/внешнем уровне. – jarlh

+0

Cant do CTE - его уже часть CTE :) это также часть вставки – Andrey

+2

IIF - это короткий путь, чем case-when-else-end: IIF (выражение, truepart, falsepart) – CeOnSql

ответ

4

Попробуйте это:

`select NULLIF (Count(something) , 0) 
4

Вот три метода:

1. (case when count(contracts) > 0 then count(contracts) end) as countcontracts 
2. sum(case when contracts is not null then 1 end) as countcontracts 
3. nullif(count(contracts), 0) 

Все три из них требуют написания более сложных выражений. Однако это действительно не так сложно. Просто скопируйте строку несколько раз и измените имя переменной на каждом из них. Или, возьмите текущий запрос, поместите его в электронную таблицу и используйте функции электронных таблиц, чтобы сделать преобразование. Затем скопируйте функцию вниз. (Электронные таблицы действительно хорошие генераторы кода для повторяющихся строк кода.)

+0

Я не уверен, что в случае его хорошей идеи, потому что это часть запроса, у которого уже есть более 14 CTE-аргументов в нескольких случаях и один UPDATE :), честно говоря, не думайте, что добавление 14 случаев дополнений не повлияет на производительность – Andrey

+1

Метод NullIf является лучшим, но в вашем примере есть ошибка, он должен быть nullif (count (контракты), 0) – uzul