sql Группировка по условиям повторяется в выборе - PullRequest
2 голосов
/ 05 марта 2020

sql:

select (case when order_id != 0 then order_id end) as order_id,
   (case when order_id = 0 then other_field end) as other_field,
   count(*)
from table t
group by (case when order_id != 0 then order_id end),
     (case when order_id = 0 then other_field end);

условие выбора (case when order_id != 0 then order_id end) и (case when order_id = 0 then other_field end) должно повторяться в запросе выбора, и я попытался добавить as field в группу по условию, например

select order_id,
   other_field,
   count(*)
from table t
group by (case when order_id != 0 then order_id end) as order_id,
     (case when order_id = 0 then other_field end) as order_field;

но это показывает ошибку, возможно ли использовать условие case один раз? потому что, возможно, условие станет слишком длинным для понимания.

1 Ответ

1 голос
/ 05 марта 2020

это определенно возможно, и вы должны повторить операторы 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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...