powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Аггрегат по отсутствующим записям
24 сообщений из 24, страница 1 из 1
Аггрегат по отсутствующим записям
    #40009064
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно ли я понимаю, что в процедуре запрос вида:
Код: plsql
1.
select sum(incval) from income where dateof = current_date into :vsum;


всегда вернёт значение?.. Т.е. если по условию записей нет, то vsum будет равно null, а не предыдущему значению?..
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009065
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Это не count.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009075
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Нет. Это не count.
Вроде вернет запись всегда, но в ней может быть NULL.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009082
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Нет. Это не count.

То есть здесь обманывают или я не правильно понимаю выделенное?
SUM() это агрегатная функция, которая вычисляет сумму значений для столбца. Если количество допустимых строк равно нулю, то SUM() возвращает значение NULL.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009083
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взять и проверить - дело одной минуты. Поведение запроса в ISQL и PSQL абсолютно одинаково.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009084
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpТо есть здесь обманывают или я не правильно понимаю выделенное?
тест селект бла-бла. ?
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009096
Dimbuch®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp
Правильно ли я понимаю, что в процедуре запрос вида:
Код: plsql
1.
select sum(incval) from income where dateof = current_date into :vsum;


всегда вернёт значение?.. Т.е. если по условию записей нет, то vsum будет равно null, а не предыдущему значению?..


Просто проверьте
Код: sql
1.
select sum(incval) from income where 1=2
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009147
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

было здесь как-то обсуждение, что "пустой" запрос НЕ обновляет переменную под into. Но лучше проверить. А ещё лучше перестраховаться, вручную обнулить переменную.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009152
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
alekcvp,

было здесь как-то обсуждение, что "пустой" запрос НЕ обновляет переменную под into. Но лучше проверить. А ещё лучше перестраховаться, вручную обнулить переменную.
В том то и дело, что на это можно рассчитывать, обнулить её, как Вы советуете, перед запросом.

А запрос в данном случае будет как раз не "пустым", и установит её назад в NULL.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009154
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Код: plsql
1.
if (row_count = 0) then ...
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009159
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimbuch®,

агрегатные функции без группировки всегда возвращают 1 запись, даже если по условию отбора там 0 записей.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t(n) as (
  select 1 from rdb$database
  union all
  select 2 from rdb$database
)
select
  count(*) as cnt,
  count(n) as cnt_n,
  sum(n) as sun_n,
  min(n) as min_n,
  max(n) as max_n,
  avg(n) as avg_n
from t
where false



Код: plaintext
1.
CNT	CNT_N	SUN_N	MIN_N	MAX_N	AVG_N
0	0				
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009162
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Нда, погорячился насчёт row_count. Тогда:
Код: plsql
1.
coalesce(sum(field), 0)
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009166
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-r
YuRock,

Код: plsql
1.
if (row_count = 0) then ...

Что это? К чему?
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009167
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-r
Симонов Денис,

Нда, погорячился насчёт row_count. Тогда:
Код: plsql
1.
coalesce(sum(field), 0)

Спасибо, что сообщили о секретной функции coalesce.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009190
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисагрегатные функции без группировки всегда возвращают 1 запись, даже если по условию отбора
там 0 записей.

Не все. И не всегда. Поведение разных функций разное. Поведение одних и тех же функций
разное в зависимости от наличия или отсутствия в запросе group by.

Ты в свой пример включил count(), что и заставило его вернуть одну запись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009199
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ты не прав

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t(n) as (
  select 1 from rdb$database
  union all
  select 2 from rdb$database
),
t2 as (
select
  sum(n) as sun_n,
  min(n) as min_n,
  max(n) as max_n,
  avg(n) as avg_n
from t
where false)
select count(*) from t2



возвращает 1.

Ораклисты зная эту особенность агрегатов зачастую используют такой трюк для обхода ошибки no data found

Код: sql
1.
2.
3.
4.
select min(somefield)
into xVal
from sometable
where id = xId;
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009203
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16.10.2020 13:14, Симонов Денис пишет:
> Ораклисты зная эту особенность агрегатов зачастую используют такой трюк для обхода ошибки no data found

я по сей день не могу понять, нахрена Оракел генерит Exception NO_DATA_FOUND .
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009212
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийнахрена Оракел генерит Exception NO_DATA_FOUND.

Чтобы кнутом обучить своих пользователей оборачивать каждый select в цикл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009214
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16.10.2020 13:32, Dimitry Sibiryakov пишет:
> Чтобы кнутом обучить своих пользователей оборачивать каждый select в цикл.

в ставке Гитлера все малахольные... (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009246
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-r
Симонов Денис,
Нда, погорячился насчёт row_count. Тогда:
Код: plsql
1.
coalesce(sum(field), 0)


Я уже обжёгся однажды, что если select не вернёт ни одной строки, то такой coalesce не поможет.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009252
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

повторяю второй раз, если в запросе только агрегатные функции без группировки и окон, то такой запрос всегда возвращает одну запись.
Если ни одна запись не подходит под критерии отбора, то count вернёт 0, остальные агрегаты sum, min, max, avg, list вернут null.
Про статистические функции и функции линейной регрессии не помню, но в доке вроде описано.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009268
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp

Я уже обжёгся однажды, что если select не вернёт ни одной строки, то такой coalesce не поможет.
Ну, дык, тогда смотри сюда: 22215267 .
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009321
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
alekcvp,

повторяю второй раз, если в запросе только агрегатные функции без группировки и окон, то такой запрос всегда возвращает одну запись.
Если ни одна запись не подходит под критерии отбора, то count вернёт 0, остальные агрегаты sum, min, max, avg, list вернут null.
Про статистические функции и функции линейной регрессии не помню, но в доке вроде описано.

Я понял, спасибо.
...
Рейтинг: 0 / 0
Аггрегат по отсутствующим записям
    #40009345
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда есть сомнения, лучше проинитить переменные перед запросом, код визуально становится более понятным, особенно когда через N месяцев требуется внести поправки. Бывает дописываю фантомные "else null", необязательные кляузы "as" и двоеточия в секции into просто для читаемости.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Аггрегат по отсутствующим записям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]