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


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

Нет. Это не count.

То есть здесь обманывают или я не правильно понимаю выделенное?
SUM() это агрегатная функция, которая вычисляет сумму значений для столбца. Если количество допустимых строк равно нулю, то SUM() возвращает значение NULL.
...
Рейтинг: 0 / 0
16.10.2020, 00:29
    #40009083
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аггрегат по отсутствующим записям
Взять и проверить - дело одной минуты. Поведение запроса в ISQL и PSQL абсолютно одинаково.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.10.2020, 00:36
    #40009084
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аггрегат по отсутствующим записям
alekcvpТо есть здесь обманывают или я не правильно понимаю выделенное?
тест селект бла-бла. ?
...
Рейтинг: 0 / 0
16.10.2020, 02:38
    #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
16.10.2020, 10:48
    #40009147
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аггрегат по отсутствующим записям
alekcvp,

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

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

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

Код: plsql
1.
if (row_count = 0) then ...
...
Рейтинг: 0 / 0
16.10.2020, 11:04
    #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
16.10.2020, 11:08
    #40009162
dennis-r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аггрегат по отсутствующим записям
Симонов Денис,

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

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

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

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

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

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

Ты в свой пример включил count(), что и заставило его вернуть одну запись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.10.2020, 13:14
    #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
16.10.2020, 13:25
    #40009203
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аггрегат по отсутствующим записям
16.10.2020 13:14, Симонов Денис пишет:
> Ораклисты зная эту особенность агрегатов зачастую используют такой трюк для обхода ошибки no data found

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

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

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


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

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

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

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

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


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