это определенно возможно, и вы должны повторить операторы case в этой ситуации (или вывести их псевдоним в подзапросе, а затем сослаться на них по псевдониму, чтобы избежать повторения), я делал это много раз. Но 1) У вас не может быть псевдонимов в группе по части 2) Ситуационные утверждения кажутся вам синтаксически неправильными, так как они пропускают часть ELSE.
Попробуйте так:
select (case when order_id != 0 then order_id else NULL end) as order_id,
(case when order_id = 0 then other_field ELSE NULL end) as other_field,
count(*)
from table t
group by case when order_id != 0 then order_id else NULL end,
case when order_id = 0 then other_field ELSE NULL end;
Чтобы избежать повторения Вы можете сделать это:
select order_id, other_field,
count(*)
from (
select (case when order_id != 0 then order_id else NULL end) as order_id,
(case when order_id = 0 then other_field ELSE NULL end) as other_field from table
)t
group by order_id, other_field ;
Редактировать: Как сказал Гордон Линофф, остальная часть не нужна, так что вы можете иметь только это:
select order_id, other_field,
count(*)
from (
select (case when order_id != 0 then order_id end) as order_id,
(case when order_id = 0 then other_field E end) as other_field from table
)t
group by order_id, other_field ;