Выберите в 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;