Выберите в Postgres с делом

Я пытаюсь сделать следующую консультацию:

        Managers | Clerks | Presidents | Analysts | Salesmans
    -------------+---------+--------------+ -----------+-------------

      3            4              1               2               4

Пока мне удается сделать:

select  CASE WHEN lower(job)='salesman' THEN count(job) as "SALESMAN"
 WHEN lower(job)='clerk' THEN count(job)  as "CLERK"
 WHEN lower(job)='manager' THEN count(job)  as "MANAGER"
 WHEN lower(job)='analyst' THEN count(job)  as "ANALYST"
 WHEN lower(job)='president' THEN count(job)  as "PRESIDENT"
from emp
group by job;

Но я не могу запустить его, он делает ошибку:

ОШИБКА: синтаксическая ошибка в или около "как"
ЛИНИЯ 1: ... СЛУЧАЙ, КОГДА ниже (работа)='продавец', ТО считать (работа) как "ПРОДАЖА...

Как использовать case в select для создания отдельных столбцов?

1 ответ

Решение

Вы должны поставить счет вокруг case:

select count(CASE WHEN lower(job)='salesman' THEN 1 END) as "SALESMAN"
       count(CASE WHEN lower(job)='clerk' THEN 1 END) as "CLERK"
       count(case WHEN lower(job)='manager' THEN 1 END) as "MANAGER"
       count(case WHEN lower(job)='analyst' THEN 1 END)  as "ANALYST"
       count(case WHEN lower(job)='president' THEN 1 END) as "PRESIDENT"
from emp;

Агрегатные функции, такие как count() игнорировать нулевые значения. CASE выражение возвращает NULL для значений, не соответствующих условию и, таким образом, они не учитываются.

Или проще с помощью filter пункт:

select count(*) filter (where lower(job)='salesman') as "SALESMAN"
       count(*) filter (where lower(job)='clerk') as "CLERK"
       count(*) filter (where lower(job)='manager') as "MANAGER"
       count(*) filter (where lower(job)='analyst')  as "ANALYST"
       count(*) filter (where lower(job)='president') as "PRESIDENT"
from emp;
Другие вопросы по тегам