powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by
36 сообщений из 36, показаны все 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
group by
    #39626101
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch((что угодно) = NULL ) = FALSE
у меня получается
((что угодно) = NULL ) = NULL
...
Рейтинг: 0 / 0
group by
    #39626102
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcociв эту ветку не входит, когда s.bundle_id not null
Код: sql
1.
2.
  case s.bundle_id
    when (not null) then 10




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

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



not TRUE = FALSE
2 + 1 = 3

not NULL = NULL
NULL + 1 = NULL

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

подозреваю, но проверять лень, что
( NULL = NULL ) = NULL ~~~~>>> FALSE
если принудительно поднимать тип к boolean not null , что скорее всего и проиcходит внутри IF/WHILE/CASE

в то же время
(NULL is not distinct from NULL ) = TRUE

Но внутри CASE видимо обычный старый добрый = для сравнения
...
Рейтинг: 0 / 0
group by
    #39626105
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да.. может он явно через оператор "=" проверяет, поэтому и спросил
when (is not null) не принимает. нужно sql стандарт посмотреть как там :)
...
Рейтинг: 0 / 0
group by
    #39626107
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockArioch((что угодно) = NULL ) = FALSE
у меня получается
((что угодно) = NULL ) = NULL

Это я второпях писал, я имел ввиду при принудительном преобразовании типаа

Ниже я это описал.... в одном случае из двух, в первый добавить примечание забыл.

>_<
...
Рейтинг: 0 / 0
group by
    #39626109
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladА второй у нас не поддерживается синтаксисом, можно попросить поддержать.
Мне кажется достаточно в том виде, в котором поддерживается:
case when <expr> is [not] null then ... end
...
Рейтинг: 0 / 0
group by
    #39626111
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcociда.. может он явно через оператор "=" проверяет, поэтому и спросил
when (is not null) не принимает. нужно sql стандарт посмотреть как там :)

Так он никогда и не будет принимать.

Скобки заставляют вычислять выражение.
Это аналогично переменным в процедуре.
Код: sql
1.
X = (is not null);


Это что? Это бессмыслица.

Если синтаксис когда-нибудь будет это принимать - то только БЕЗ скобок.

PS. ну а пока видимо придётся выпендриваться через "волшебные числа"
Код: sql
1.
case coalesce(s.bundle_id, 12345654321) .... 
...
Рейтинг: 0 / 0
group by
    #39626113
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да.. здесь мой промах, сорри )
...
Рейтинг: 0 / 0
group by
    #39626124
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockhvladА второй у нас не поддерживается синтаксисом, можно попросить поддержать.
Мне кажется достаточно в том виде, в котором поддерживается:
case when <expr> is [not] null then ... endА если 3-х этажный <expr> нужно протестировать на null и ещё на десяток значений ?
Везде повторять написание <expr> ?
Да, derived tables или CTE помогут это обойти, но если там и так каскад вложенных селектов ? :)

Фича не убийственно нужная, согласен. Но с ней лучше, чем без неё. Хотя можно и обойтись
...
Рейтинг: 0 / 0
group by
    #39626126
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcociнужно sql стандарт посмотреть как там :)Я уже вкратце написал, как там.
Или дать полную цитату ? Там многа букав (ц) :)
...
Рейтинг: 0 / 0
group by
    #39626128
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даешь тупли и pattern matching в SQL CASE DDDD
...
Рейтинг: 0 / 0
group by
    #39626132
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladА если 3-х этажный <expr> нужно протестировать на null и ещё на десяток значений ?
Нет, разбить на два:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
  CASE <expr> IS NULL
    WHEN TRUE THEN <res_null>
    ELSE CASE <expr>
      WHEN <value1> THEN <res_1>
      WHEN <value2> THEN <res_2>
      WHEN <value3> THEN <res_3>
      ELSE <res_unk>
    END
  END
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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