Группировка по полю с case'ом в IB7.5

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
veart
Сообщения: 29
Зарегистрирован: 25 янв 2006, 09:39

Группировка по полю с case'ом в IB7.5

Сообщение veart » 11 апр 2008, 07:48

Есть запрос, в котором есть поля, вычисляемые case-ом
Напр
select dh.docindex, case when (dh.DOCKIND=1 and CLIENT2_INDEX=1444) or (dh.DOCKIND=2 and CLIENT_INDEX=1444) then -1*ds.QUANTITY else ds.QUANTITY end as Qnt, sum(ps.quantity)
from DOCSPEC ds
left join DOCHEAD dh on ds.ID_DOCHEAD=dh.ID_DOCHEAD
left join partspec ps on ps.articul=ds.articul and ds.id_dochead=ps.dochead
where ...
group by dh.docindex, ????

Нужно сгруппировать и посчитать сумму. Что указать в group by?

В Firebird-e в этом плане все отлично - можно указать номер поля и все (group by 1,2)
Пробовал и псевдоним ставить (Qnt) и весь case и поля из case.

Больше пользуюсь FB. Подскажите, кто знает как в IB сие реализуется?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 11 апр 2008, 10:51

IB не пользуюсь.
Если в GROUP BY написать то же самое, что в поле, т.е. CASE ... END, то тоже не хочет?

veart
Сообщения: 29
Зарегистрирован: 25 янв 2006, 09:39

Сообщение veart » 11 апр 2008, 11:35

Не, не хочет - ругается на case

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 11 апр 2008, 11:37

А что говорит на эту тему документация?
Вроде мануал разработчика к IB в комплекте идёт.

veart
Сообщения: 29
Зарегистрирован: 25 янв 2006, 09:39

Сообщение veart » 11 апр 2008, 12:06

Такого случая там не рассматривается. Есть описания для case и для group by, а для такого сочетания ничего не нашел. Раньше похожие ситуации были, прокатывало, если в group by вписать поле, которое было в case-е. Но тут case слишком хитрый. Не прокатывает так.

Esperito
Сообщения: 10
Зарегистрирован: 09 авг 2007, 19:23

Сообщение Esperito » 11 апр 2008, 18:44

ds.QUANTITY не нужно суммировать?

veart
Сообщения: 29
Зарегистрирован: 25 янв 2006, 09:39

Сообщение veart » 14 апр 2008, 06:47

Esperito писал(а):ds.QUANTITY не нужно суммировать?
Не нужно. Да и не в этом вопрос.

Пока обошел проблему так:
select ds.id_dochead, ds.articul, max( case when (dh.DOCKIND=1 and CLIENT2_INDEX=1444) or (dh.DOCKIND=2 and CLIENT_INDEX=1444) then -1*ds.QUANTITY else ds.QUANTITY end) as Qnt, sum(ps.quantity)
from DOCSPEC ds
left join DOCHEAD dh on ds.ID_DOCHEAD=dh.ID_DOCHEAD
left join partspec ps on ps.articul=ds.articul and ds.id_dochead=ps.dochead
where ...
group by ds.id_dochead, ds.articul

т.е убрал это поле с case-ом из гуппировки, а т.к. оно в группе все равно будет одинаковым, то можно прилепить на него max, min или avg, они все равно его не изменят. Работает, но все равно хотелось бы узнать как такие поля в group by добавляются. Вопрос открыт.

DMA
Сообщения: 6
Зарегистрирован: 24 дек 2007, 17:03

Сообщение DMA » 14 апр 2008, 17:18

select dh.docindex, case when (dh.DOCKIND=1 and CLIENT2_INDEX=1444) or (dh.DOCKIND=2 and CLIENT_INDEX=1444) then -1*ds.QUANTITY else ds.QUANTITY end as Qnt, sum(ps.quantity)
from DOCSPEC ds
left join DOCHEAD dh on ds.ID_DOCHEAD=dh.ID_DOCHEAD
left join partspec ps on ps.articul=ds.articul and ds.id_dochead=ps.dochead
where ...
group by dh.docindex, ????
А может: group by dh.docindex, Qnt

veart
Сообщения: 29
Зарегистрирован: 25 янв 2006, 09:39

Re: Группировка по полю с case'ом в IB7.5

Сообщение veart » 27 апр 2008, 18:13

veart писал(а): Пробовал и псевдоним ставить (Qnt) и весь case и поля из case.
Пробовал уже все...
Странно что никто не сталкивался... Не думаю что такое не реализовано. Если даже в бесплатном файрберде все это уже есть...

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Группировка по полю с case'ом в IB7.5

Сообщение dimitr » 27 апр 2008, 18:30

veart писал(а):Не думаю что такое не реализовано
а зря...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 27 апр 2008, 20:14

Если даже в бесплатном файрберде все это уже есть...
прежде чем говорить чушь, надо хоть чуть-чуть следить за новостями обеих серверов. CASE впервые появился в Firebird. И только потом в IB.
Так что как раз реализация этого в IB под вопросом.

Ответить