При определении количества элементов в виде «NULL» в результирующей таблице запроса нам возвращается значение «0».
1. Искусственно сформируем таблицу с двумя строками, где колонка будет со значением "NULL":
ВЫБРАТЬ
NULL КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(ВременнаяТаблица.Поле1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
В результате получим таблицу:
2. Немного изменим запрос.
Добавим в одни из первых запросов значение:
ВЫБРАТЬ
NULL КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(ВременнаяТаблица.Поле1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
В результате получим таблицу:
3. Попробуем добавить в запрос "РАЗЛИЧНЫЕ":
ВЫБРАТЬ
NULL КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица.Поле1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
В результате получим таблицу:
Вывод:
Известно, что NULL не является значением (его отсутствие), но для меня было не очевидно данное поведение.
просто немного по другому надо строить запросы и все отлично считается, попробуйте так
Показать
Забавное наблюдение. Интересно, а сюрпризов от других СУБД не будет (cам проверил на файловой и MS SQL)?
Кэп, агрегаты КОЛИЧЕСТВО(), СУММА() полностью осмыслены?
вы же осмыслили тезис
а теперь примените это знание к агрегату
Эх, вот и мое пришло время вставить свое занудное замечание.
Коллеги, если не обращаться ни к документации, ни к справке, ни к книгам, можно еще много найти неожиданностей.
● Функция позволяет подсчитать количество значений указанного поля, не равных NULL.
● Функция позволяет подсчитать количество различных значений указанного поля, не равных NULL. Для этого перед спецификацией поля нужно указать ключевое слово РАЗЛИЧНЫЕ.
● Функция позволяет подсчитать количество строк в результате запроса. Для этого в качестве параметра функции нужно указать звездочку «*».
В качестве параметра функции можно указывать ссылки на поля, содержащие значения любого типа.
(1)
Лениво проверять, но ИМХО , в запросе ошибка.
(5)
Это понятно. А как посчитать NULL, если надо ?
(7) Уточните, пожалуйста, в какой ситуации? Не могу ответить в общем случае, т.к. они довольно разнообразны, соответственно и счет будет разнообразным.
(6) нет там ошибки, я же его в консоли писал, уж кнопку: Выполнить нажать мне не лень было
А не проще через ЕстьNull — определить как удобное для вас значение и его посчитать?
Ну для меня это самый удобный способ, так как часто приходиться выводить таблицы, где может быть Null. для дальнейшей работы.
А вообще сам по себе null конечно в многих функция отрабатывает не так ожидаешь, но надо быть к этому готовым. ))
(7) Сумма(Выбор Когда Поле есть NULL тогда 1 иначе 0 Конец)
(5) Посмотрев на документацию должна сработать конструкция
КОЛИЧЕСТВО(*) — КОЛИЧЕСТВО(ТаблицаДанных.Поле1) КАК Результат
Но это не очевидное решение и при чтении кода, потом явно будут проблемы =)
(12) Можно попробовать дать понятный псевдоним. 🙂 Либо воспользоваться конструкцией из (11). В конце концов задача подсчета количества строк, где есть значение NULL не самая распространенная, поэтому из контекста должно быть понятно, что это за выражение запроса.
(11)
Или
Количество(ЕСТЬNULL(Поле, 0)). Вместо 0 можно вроде даже Неопределено поставить. Главное, что не Null)
(14) у вас не количество значений null, а количество с учетом null. Так и сумма(1) можно использовать.
(15) а там группировка стоит по полю со значением НУЛЛ, как раз и получаем количество строк (как писали выше) со значением НУЛЛ
а вот интересно почему группировка понимает НУЛЛ? и правильно группирует по нему?
(15) в таком случае и смысл задачи отсутствует. Чисто только для теории.. Правда, какой смысл использовать ЕСТЬNULL(Null, 0), если null всегда есть null:)
Показать