2012-06-06 4 views
1

Следующий запрос отлично работает за пределами него, все еще возвращает нулевые значения как NULL вместо 0. В частности, это суммирует количество случаев, когда что-то произошло в указанном диапазоне дат. Если значение просто не существует в параметрах (то есть NULL,), то для удобства чтения я бы хотел, чтобы он возвращал 0 (таблица, которая является объединением нескольких временных таблиц, содержит только целые числа). Я исследовал и нашел этот случай «How can I change NULL to 0 when getting a single value from a SQL function?» и попробовал все предложения там, в том числе COALESCE.ISNULL() не работает ... возможно неправильное размещение?

(SELECT tn.teamtext, tn.teamid, ISNULL(sum(ISNULL(case when CONVERT(smalldatetime,ca.dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' then 1 else 0 end, 0)), 0) AS cnt3 
    FROM teamnames AS tn 
    LEFT OUTER JOIN caseaudit AS ca 
    ON tn.teamID = ca.referteamID2 
    WHERE ca.referteamid1 <> ca.referteamid2 AND ca.isactive = 1 AND ca.groupid = 18 AND ca.accountid = 2 AND ca.referteamid1 = 31 AND ca.auditnote <> 'Suspend Case' 
    GROUP BY tn.teamtext, tn.teamid) AS c 

Чтобы дать представление о том, возвращаемой таблицы Я смотрю, здесь:

4H BOSS     55 59 3 
4H BSG      0 3 2 
4H SALES AND MKTG   0 0 0 
ACCOUNTS RECEIVABLE  0 0 0 
ASSET MANAGEMENT   9 16 0 
AUDIT      0 0 NULL 
BOSS      4 5 0 
CORPORATE BSG    0 7 5 
CUSTOMER SUPPORT   87 133 NULL 
NETWORK ENGINEERING  11 15 0 
PRODUCTION ENGINEERING  116 142 5 
PRODUCTION OPERATIONS  0 1 0 
SECURITY     2 6 3 
SNFAL PRODUCT TEAM   0 14 11 
VOICE SERVICES    18 21 0 
XEROX      4 8 0 
+1

где dModLast, исходящий? caseaudit? – Diego

+0

Да. все происходит из таблицы caseaudit, за исключением командного текста и teamid. Извините, я добавлю псевдонимы. –

+1

, который rdbms? что isnull, обертывающее функцию sum, не должно допускать, чтобы эти нули могли пройти. Все в этом случае утверждение не имеет значения ... – dotjoe

ответ

2

Я согласен с (до сих пор) два других ответов - логика NULL в этом запрос должен работать, как вы говорите. Но ...

Я использовал что-то вроде вашего запроса на локальном столе, и все прошло нормально. Затем я добавил самые внешние парны:

(SELECT... 
...) AS c 

и получил сообщение об ошибке, поскольку SQL не поддерживает этот формат. Это, в сочетании с вашим примером, показывающим четыре столбца, в которых только три указаны в запросе, заставляет меня сильно подозревать, что это подзапрос в более крупном запросе ... в этом случае проблема null/not null, вероятно, запуталась в логика полного запроса , а не только этот подзапрос. Если мои предположения верны, пожалуйста, напишите полный запрос для нашего рассмотрения.

+0

Это действительно правильно. Я понял, однако, на самом деле вопрос ответа в Интернете может вызвать проблемы с безопасностью. Спасибо за помощь каждого. Технически, никогда не было проблемы с логикой ISNULL. Проблема заключалась в том, как я выполнял подзапрос. –

1

Я предполагаю, так как CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' ссылок правой таблицы, иногда она может вычисляться NULL и дело не получить его.

Вы можете попробовать явно делать when (dModLast is null) then 0

EDIT:

case 
    when dModLast is null then 0 
    when CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' then 1 
    else 0 
end 
+0

dModLast определенно исходит из правильной таблицы. И используя случай, когда до того, как моя функция CONVERT совпадает с тем, что вы предлагаете здесь (я думаю.), Я не могу делать 'когда (dModLast равно null), а затем 0' внутри моей функции преобразования. Вот почему я попытался использовать функцию ISNULL, которая, к сожалению, пока не работает. –

+0

Почему вы не можете это сделать? это было бы такое же поведение – Diego

+0

Я пробовал ... возможно, это была синтаксическая ошибка с моей стороны. Каков был бы правильный синтаксис для этого? –

1

Изменения в

ISNULL(SUM(CASE WHEN ISNULL(ca.dModLast,0)=0 THEN 0 ELSE CASE WHEN CONVERT(smalldatetime,ca.dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' THEN 1 ELSE 0 END END),0) as cnt3 
+0

Это выглядело очень обнадеживающим, но без сигары. Вернул то же самое. –

+0

Это потому, что вы делаете левое соединение. Попробуйте отредактировать ответ. – Justin

+0

Пробовал это тоже ... все еще не работал. Я думаю, мы смотрим на все это неправильно. –

Смежные вопросы