Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неправльный результат из запроса при использовании функции ISNULL  [new]
Чиграборти
Member

Откуда:
Сообщений: 143
Люди, есть 2 таблицы: категории уроков (Category) и уроки (Tutorials) и запрос:
SELECT Category.Title, COUNT(Tutorials.TutorialID) AS TutsCount
FROM Category LEFT JOIN
                      Tutorials ON Category.CategoryID = Tutorials.Category                      
GROUP BY Category.Title
результат из него получается правильный:

ASP.NET и Web-Forms - 1
Начинающим - 2
Изучаем C# - 0 (ТУТ ВНИМАНИЕ)

Так же получаю этот варнинг.
Warning: Null value is eliminated by an aggregate or other SET operation.

Пытаюсь исправить варнинг, т.е. заменить в запросе полученные значения "NULL на 0". На форуме нашёл решение с помощью функции ISNULL и переписал запрос так:
SELECT Category.Title, COUNT(ISNULL(Tutorials.TutorialID,0)) AS TutsCount
FROM Category LEFT JOIN
                      Tutorials ON Category.CategoryID = Tutorials.Category                      
GROUP BY Category.Title
результат из него получается неправильный:

ASP.NET и Web-Forms - 1
Начинающим - 2
Изучаем C# - 1 (ТУТ ВНИМАНИЕ)

Почему количество укроков в группе "Изучаем С#" = 1, если в ней вообще нет уроков?
30 ноя 09, 19:21    [7998719]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Glory
Member

Откуда:
Сообщений: 104760
Изучаем BOL

COUNT(*) returns the number of items in a group. This includes NULL values and duplicates.

COUNT(ALL expression) evaluates expression for each row in a group and returns the number of nonnull values.
30 ноя 09, 19:26    [7998731]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Чиграборти
Member

Откуда:
Сообщений: 143
Glory
Изучаем BOL

COUNT(*) returns the number of items in a group. This includes NULL values and duplicates.

COUNT(ALL expression) evaluates expression for each row in a group and returns the number of nonnull values.

Что-то не выходит у начинающего ...
Мне нужно вывести количество уроков в группе. Даже если в группе нет уроков, то нужно вывести "0". Что я и пытался сделать. Помогите пожалуйста.
30 ноя 09, 19:38    [7998753]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Чиграборти
Member

Откуда:
Сообщений: 143
Я просто не могу понять, почему сервер вставляет 1, хотя там должен быть 0 ???
30 ноя 09, 19:50    [7998778]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Glory
Member

Откуда:
Сообщений: 104760
Чиграборти
Я просто не могу понять, почему сервер вставляет 1, хотя там должен быть 0 ???

Потому что count различает NULL-ы и неNULL-ы
анализируйте это
select count(cast(null as int)), count(isnull(cast(null as int),0))
30 ноя 09, 20:15    [7998819]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Чиграборти
Member

Откуда:
Сообщений: 143
Уважаемый Glory, по Вашим подсказкам у меня получается тоже самое, или везде "0", или опять подставляется "1".
30 ноя 09, 20:43    [7998873]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Glory
Member

Откуда:
Сообщений: 104760
Чиграборти
Уважаемый Glory, по Вашим подсказкам у меня получается тоже самое, или везде "0", или опять подставляется "1".

По всей видимости вы пример даже не запускали. Потому что в примере получается 0 и 1, т.е. разные значения
30 ноя 09, 20:54    [7998894]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Чиграборти
Member

Откуда:
Сообщений: 143
По первому варианту select count(cast(null as int)):
SELECT Category.Title, COUNT(cast(null as int)) AS TutsCount
FROM Category LEFT JOIN
                      Tutorials ON Category.CategoryID = Tutorials.Category                                            
GROUP BY Category.Title
В реультате все группы с нулевыми значениями.

По второму варианту count(isnull(cast(null as int),0)):
SELECT Category.Title, COUNT(isnull(cast(null as int),0)) AS TutsCount
FROM Category LEFT JOIN
                      Tutorials ON Category.CategoryID = Tutorials.Category                                            
GROUP BY Category.Title
Вместо "0" подставляется "1" (категория C#).

Почему у нас с Вами разные результаты?
30 ноя 09, 20:58    [7998907]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Glory
Member

Откуда:
Сообщений: 104760
Чиграборти


Почему у нас с Вами разные результаты?

Потому что лично я запускаю запрос
select count(cast(null as int)), count(isnull(cast(null as int),0))
Откуда видно, то NULL-ы и неNULL-ы по разному учитываются функцией count
О чем также говорит и цитата из хелпа
Что еще вам непонятно ?
30 ноя 09, 21:01    [7998914]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Чиграборти
Member

Откуда:
Сообщений: 143
Glory
Чиграборти


Почему у нас с Вами разные результаты?

Потому что лично я запускаю запрос
select count(cast(null as int)), count(isnull(cast(null as int),0))
Откуда видно, то NULL-ы и неNULL-ы по разному учитываются функцией count
О чем также говорит и цитата из хелпа
Что еще вам непонятно ?

Мне не понятно, как написать запрос, чтобы получить такой результат:
ASP.NET и Web-Forms - 1
Начинающим - 2
Изучаем C# - 0
Но так же не получить Варнинга (см. первое сообщение).

Заранее спасибо.
30 ноя 09, 21:14    [7998941]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
iljy
Member

Откуда:
Сообщений: 8711
Чиграборти,

не очень понятно чем вам помешало предупреждение, но раз уж так хочется - вот вам два варианта
1. не рекомендуется.
SET ANSI_WARNINGS OFF
SELECT c.Title, COUNT(t.TutorialID) AS TutsCount
FROM Category c LEFT JOIN
                      Tutorials t ON c.CategoryID = t.Category                                            
GROUP BY c.Title

2. Честный, но сложный
SELECT c.Title, SUM(case when t.TutorialID is null then 0 else 1 end) AS TutsCount
FROM Category c LEFT JOIN
                      Tutorials t ON c.CategoryID = t.Category                                            
GROUP BY c.Title
30 ноя 09, 21:18    [7998950]     Ответить | Цитировать Сообщить модератору
 Re: Неправльный результат из запроса при использовании функции ISNULL  [new]
Чиграборти
Member

Откуда:
Сообщений: 143
iljy, благодарю Вас.

Про решение в первом варианте уже читал на этом форуме, там тоже не рекомендовали его использовать.

Скажите, а этот Варнинг в будующей работе приложения не помешает? Если нет, то зачем они вообще вылетают?
30 ноя 09, 21:38    [7999004]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить