powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by
25 сообщений из 36, страница 1 из 2
group by
    #39625483
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите плиз, почему птица не хочет групировать так? вроди ничего криминального...

Код: sql
1.
2.
3.
4.
5.
select
  iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1
...
Рейтинг: 0 / 0
group by
    #39625556
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

Вроде нет криминала. И вроде группирует. Только смысл группировать одно поле?
...
Рейтинг: 0 / 0
group by
    #39625571
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будут потом и другие поля, упростил пример...

Странно, я в эксперте получаю

Код: plaintext
1.
2.
3.
4.
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

FB 3.0.2 x64

если абстрактизировал типа

Код: sql
1.
2.
3.
4.
select
  iif(null is not null, 10, coalesce((select 1 from rdb$database rows 1), 1)) as status_id
from rdb$database s
group by 1


то работает...
...
Рейтинг: 0 / 0
group by
    #39625577
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

Ты внутри используешь привязку к s.id
Но по этому полю нет группировки.
...
Рейтинг: 0 / 0
group by
    #39625583
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
убрал s.id но тоже не хочет, хотя мне надо с s.id, без group by работает

вот, удалось сделать абстрактный пример который тоже ошибку выдает:

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1



если вместо s.rdb$relation_id константа, то нету ошибок
...
Рейтинг: 0 / 0
group by
    #39625629
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
select
  max(iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database), 1))) as status_id
from rdb$database s
group by iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database), 1))
...
Рейтинг: 0 / 0
group by
    #39625764
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему max(? здесь же iif( где выходит один одно целое поле.
теоретически можно же групировать такое. здесь больше похоже на глюк.
...
Рейтинг: 0 / 0
group by
    #39625805
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

а что, iif стал агрегатной функцией?
...
Рейтинг: 0 / 0
group by
    #39625831
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvа что, iif стал агрегатной функцией?
Обычно IIF вполне себе нормально группируется.
...
Рейтинг: 0 / 0
group by
    #39625832
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcociвот, удалось сделать абстрактный пример который тоже ошибку выдает:

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1



если вместо s.rdb$relation_id константа, то нету ошибок

Если убрать
Код: plaintext
select 3 from rdb$database b
, то ошибки тоже нет.
...
Рейтинг: 0 / 0
group by
    #39625935
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, глаз замылился.
Запрос с GROUP BY без агрегатных функций возможен только для констант.
...
Рейтинг: 0 / 0
group by
    #39625938
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exteris,

даже если и бы - чего вы пытаетесь парсер ... обмануть? Пишите как положено.
...
Рейтинг: 0 / 0
group by
    #39625969
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryБлин, глаз замылился.
Запрос с GROUP BY без агрегатных функций возможен только для констант.
А что в данном случае не константа?


Код: sql
1.
2.
3.
4.
select
  iif(1=0, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1

Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce(null, 1)) as status_id
from rdb$database s
group by 1

Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1

Ошибка есть.
...
Рейтинг: 0 / 0
group by
    #39626001
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExterisА что в данном случае *не* константа?

s.rdb$relation_id
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
group by
    #39626044
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему обмануть?

Вот этот не пашет:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1



А этот работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce(5, 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1



И этот тоже работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(true, 10, coalesce((select 1 from rdb$database rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1
...
Рейтинг: 0 / 0
group by
    #39626051
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

а если iif заменить на case ?
...
Рейтинг: 0 / 0
group by
    #39626058
Фотография Sergey1979
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1



Так ошибка.
Однако вот так
Код: sql
1.
2.
3.
4.
5.
6.
with TMP as (select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s)
select status_id
from TMP
group by 1


всё работает.
...
Рейтинг: 0 / 0
group by
    #39626073
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociПочему обмануть?

Вот этот не пашет:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1




А этот работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce(5, 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1




И этот тоже работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(true, 10, coalesce((select 1 from rdb$database rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1

Мне кажется, с этим уже можно в трекер
...
Рейтинг: 0 / 0
group by
    #39626075
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exteris
Код: sql
1.
2.
3.
4.
select
  iif(1=0, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1


Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce(null, 1)) as status_id
from rdb$database s
group by 1


Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1


Ошибка есть.А с этим - ещё лучше. В трекер, плс
...
Рейтинг: 0 / 0
group by
    #39626079
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Влад, через case тоже не хочет. Как я понял iif внутри тоже в case превращается.
Без group by все ok:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
  case
    when (s.bundle_id is not null) then 10
    else coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)
  end as status_id
--  , count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
-- group by 1



Кстати заметил что так, (not null) принимает, а в эту ветку не входит, когда s.bundle_id not null, или так задуманно?

Код: sql
1.
2.
  case s.bundle_id
    when (not null) then 10
...
Рейтинг: 0 / 0
group by
    #39626087
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, жесть, через CTE работает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
with tmp as (
  select iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id
  from ta_submit_slot s
  where s.submit_id = :submit_id)
select t.status_id, count(*)
from tmp t
group by 1



Спасибо Sergey1979, буду пока так сделать, вроди читает оптимально. Вчера делал через left join SP_ но не так красиво.
...
Рейтинг: 0 / 0
group by
    #39626091
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociВлад, через case тоже не хочетДа, я уже попробовал.

Dorin MarcociКстати заметил что так, (not null) принимает, а в эту ветку не входитДумаю, тоже баг, можно вот с этим в трекер
Код: sql
1.
2.
3.
4.
5.
6.
7.
select s.rdb$relation_id, case s.rdb$relation_id when null then 'null' else 'not null' end
  from rdb$database s

union all

select s.rdb$relation_id, case s.rdb$relation_id when not null then 'not null' else 'null' end
  from rdb$database s

Возвращает
RDB$RELATION_ID F_1129 not null129 null
...
Рейтинг: 0 / 0
group by
    #39626094
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OK, спасибо всем!, добавлю тикеты к вечеру
...
Рейтинг: 0 / 0
group by
    #39626098
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
not TRUE = FALSE
2 + 1 = 3

not NULL = NULL
NULL + 1 = NULL

((что угодно) = NULL ) = FALSE

подозреваю, но проверять лень, что

( NULL = NULL ) = NULL => FALSE (если принудительно поднимать тип к boolean not null)

в то же время

(NULL is not distinct from NULL ) = TRUE

(NULL NULL ) = FALSE

Код: sql
1.
2.
  case s.bundle_id
    when (not null) then 10

[/quote]

это если развернуть в полную форму будет

Код: sql
1.
2.
  case 
    when s.bundle_id = null then 10

[/quote]
...
Рейтинг: 0 / 0
group by
    #39626099
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociКстати заметил что так, (not null) принимает, а в эту ветку не входитВчитываясь в стандарт, вижу, что есть два разных случая

1. сравнение с выражением
case <expr> when [not] null then ... end

тут аналогия с <expr> = [not] null и результат всегда false

2. тестирование на нулл
case <expr> when is [not] null then ... end

тут аналогия с <expr> is [not] null и результат зависит от <expr>

Первый случай мы как раз имеем выше, и это не баг.
А второй у нас не поддерживается синтаксисом, можно попросить поддержать. Но это тоже не баг.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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