Страница 1 из 1

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

Добавлено: 11 апр 2008, 07:48
veart
Есть запрос, в котором есть поля, вычисляемые 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 сие реализуется?

Добавлено: 11 апр 2008, 10:51
WildSery
IB не пользуюсь.
Если в GROUP BY написать то же самое, что в поле, т.е. CASE ... END, то тоже не хочет?

Добавлено: 11 апр 2008, 11:35
veart
Не, не хочет - ругается на case

Добавлено: 11 апр 2008, 11:37
WildSery
А что говорит на эту тему документация?
Вроде мануал разработчика к IB в комплекте идёт.

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

Добавлено: 11 апр 2008, 18:44
Esperito
ds.QUANTITY не нужно суммировать?

Добавлено: 14 апр 2008, 06:47
veart
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 добавляются. Вопрос открыт.

Добавлено: 14 апр 2008, 17:18
DMA
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

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

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

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

Добавлено: 27 апр 2008, 18:30
dimitr
veart писал(а):Не думаю что такое не реализовано
а зря...

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