Имя: Пароль:
1C
1С v8
Снова этот NULL
,
0 Crush
 
06.03.13
13:28
Начитался. Знаю, что NULL - это неизвестность и неизвестность нельзя сравнить ни с чем. Даже с собой.
А вот Итоги, Группировка, и "Выбрать различные" считают, что неизвестности равны. При этом наблюдается различное поведение агрегатной функции Количество().
Если её использовать в итогах, то возвращает Null. А если в группировке, то вернет 0.
Уверен, что такой случай уже разбирался, но найти не смог. Дайте комменты почему так происходит.

ВЫБРАТЬ
   NULL КАК поленул
ПОМЕСТИТЬ вт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   вт.поленул КАК поленул,
   вт.поленул КАК Количество,
   вт.поленул КАК Сумма,
   вт.поленул КАК КоличествоРазличных
ИЗ
   вт КАК вт
ИТОГИ
   КОЛИЧЕСТВО(Количество),
   СУММА(Сумма),
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КоличествоРазличных)
ПО
   поленул
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   вт.поленул,
   КОЛИЧЕСТВО(вт.поленул) КАК Количество,
   СУММА(вт.поленул) КАК Сумма,
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ вт.поленул) КАК КоличествоРазличных
ИЗ
   вт КАК вт

СГРУППИРОВАТЬ ПО
   вт.поленул
1 Fragster
 
гуру
06.03.13
13:30
гы
2 Fragster
 
гуру
06.03.13
13:31
вообще итоги - фигня какая-то, правильно количетсво(NULL) = 0
3 Тролль главный
 
06.03.13
13:32
у меня сервеная база в итогах количество дает 0
4 GANR
 
06.03.13
13:34
НЕЧЕГО NULLу в условиях и группировках вообще делать (исключение проверка на IS NULL)
5 Crush
 
06.03.13
13:37
(3) Серверная (mssql + 8.1.12.101) даёт Null и файловая  (8.2.15.317) тоже даёт null :)
А у тебя какой релиз?
6 Тролль главный
 
06.03.13
13:38
(5) 1С:Предприятие 8.2 (8.2.17.153)
7 Fragster
 
гуру
06.03.13
13:38
(5) а что, ломалку на более новую версию не нашли?
8 Тролль главный
 
06.03.13
13:39
и файловая дает 0
9 Megas
 
06.03.13
13:39
(3) У тебя наверное столько много NULL что их хватает на маленький "0"
10 Рэйв
 
06.03.13
13:40
Сделай
ЕстьNULL(полеСNULL,0) КАК Нулл

и будет сравнивай наздоровье
11 Тролль главный
 
06.03.13
13:40
группировку делает SQL, итоги - платформа
12 Рэйв
 
06.03.13
13:40
*и будет тебе счастье)
13 Тролль главный
 
06.03.13
13:40
(10) дело в принципе COUNT не может NULL давать
14 Defender aka LINN
 
06.03.13
13:42
(5) 8.2.16 - 0
15 exchang
 
06.03.13
13:47
(0) март, весна, птички, девчонки
16 rs_trade
 
06.03.13
13:49
(0) В разных местах SQL запроса нулл обрабатывается по разному. Так и есть.
17 Тролль главный
 
06.03.13
13:50
а нет, вру NULL дает КОЛИЧЕСТВО в ИТОГАХ, 0 - КОЛИЧЕСТВО РАЗЛИЧНЫЕ

прошу прощения
18 Тролль главный
 
06.03.13
13:51
+(17) считаю это багой платформы
19 Crush
 
06.03.13
13:59
OFF(7) обижаешь! Всё легально. Просто есть "обстоятельства непреодолимой силы"

(6) (18)  поставил 8.2.17.153, пустая конфа, Обычное приложение.
В консоль запросов (с итс) вставляю текст

ВЫБРАТЬ
   NULL КАК поленул
ПОМЕСТИТЬ вт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   вт.поленул КАК поленул,
   вт.поленул КАК Количество,
   вт.поленул КАК КоличествоРазличных
ИЗ
   вт КАК вт
ИТОГИ
   КОЛИЧЕСТВО(Количество),
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КоличествоРазличных)
ПО
   поленул

Количество = null
КоличествоРазличных = 0

Куда копать?
20 Crush
 
06.03.13
14:00
+(19)

Количество = null

КоличествоРазличных = 0

Куда копать?
21 rs_trade
 
06.03.13
14:01
Не стоит обсуждать работу NULL-а на примере 1С. Поведение NULL-а идет из SQL.
22 Sammo
 
06.03.13
14:02
А какой содержательный смысл считать количество нуллов?
23 exchang
 
06.03.13
14:02
Тусклый свет монитора ослепил смысл жизни Краш, он не спал уже третьи сутки, беспомощный и взъерошенный, он беспощадно энтерил в консоли. Очевидная истина никак не хотела смириться в своей неизвестности.
24 НафНаф
 
06.03.13
14:04
(21) да, только 1С его использует
25 КонецЦикла
 
06.03.13
14:07
(20) А какое количество различных должно быть?
SQL считает что 0
26 КонецЦикла
 
06.03.13
14:08
А количество 0
Все правильно
Количество - это же агрегация
27 Crush
 
06.03.13
14:09
(21) согласятся те, кто работает с sql минуя 1С. Я к таким не отношусь :(

(22) анализировал тут с помощью консоли и столкнулся с отсутствием фантазии при подсчете удаленных строк таблицы. Поле "Удалена" добавлять было в лом. Решил считать нулы:)

Кстати такая конструкция оба количества равняет к 1

ВЫБРАТЬ
   NULL КАК поленул
ПОМЕСТИТЬ вт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   NULL

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "ненул"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   вт.поленул КАК поленул,
   вт.поленул КАК Количество,
   вт.поленул КАК КоличествоРазличных
ИЗ
   вт КАК вт
ИТОГИ
   КОЛИЧЕСТВО(Количество),
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КоличествоРазличных)
ПО
   ОБЩИЕ
28 hhhh
 
06.03.13
14:13
(27) а так?

ВЫБРАТЬ
   ЕСТЬNULL(NULL, "удалена") КАК поленул
ПОМЕСТИТЬ вт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ЕСТЬNULL(NULL, "удалена")

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "ненул"
;
29 Crush
 
06.03.13
14:23
(28) говорю же, тут всё понятно!
Не понятно почему счетчик строк даёт неизвестность, при этом счет различных строк - говорит, что н0ль.
А реально строк - 2.

Хмм... походу начинает доходить.. Считаются то не строки, а значения.. Значения нет.
Ну все равно Количество() и Количество(РАЗЛИЧНЫЕ) должны быть равны либо 0 либо Null либо 1 либо 2.
Кстати, из логики Null-а обе функции должны возвращать Null. Т.к. мы не можем утверждать, что количество значений 0, 1 или 2. - значений же нет!
30 Crush
 
06.03.13
14:24
+(29) Глядишь 1С когда-нибудь переплюнет SQL:)
31 НафНаф
 
06.03.13
14:25
(29) значения есть, но они неизвестны или неопределены, а да, "Неопределено" же в 1С другое

такая вот платформа для хомячков
32 rs_trade
 
06.03.13
14:36
(27) Почитав в BOL как ведет себя NULL, не будет вопросов к 1с.
33 КонецЦикла
 
06.03.13
14:47
(29) "Returns the number of items in a group. COUNT works like the COUNT_BIG function. The only difference between the two functions is their return values. COUNT always returns an int data type value. COUNT_BIG always returns a bigint data type value."

(цы)
34 КонецЦикла
 
06.03.13
14:48
(30) Кое-что она перемалывает у себя в кишках
Если нуралиевцы налажают то и переплюнуть может :)
35 Crush
 
06.03.13
15:26
(32)
COUNT

Типы возвращаемых данных - int !!!!

Замечания
Функция COUNT(*) возвращает количество элементов в группе. Сюда входят значения NULL и повторяющиеся значения.

Функция COUNT(ALL expression) оценивает expression для каждой строки в группе и возвращает количество значений, не равных NULL.

Функция COUNT(DISTINCT expression) оценивает expression для каждой строки в группе и возвращает количество уникальных значений, не равных NULL.

Для возвращаемых значений, больших 2^31-1, функция COUNT формирует сообщение об ошибке. Вместо этого следует использовать COUNT_BIG.

Вырезано из http://msdn.microsoft.com/ru-ru/library/ms175997.aspx
36 Crush
 
06.03.13
15:28
(33) COUNT always returns an int data type value
Вот и оно!
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.