#sql #postgresql
#sql #postgresql
Вопрос:
Я должен получить список счетчиков из таблицы, используя department
вот мою структуру таблицы
empid empname department departmentId joinedon
я хочу заполнить всех присоединенных сотрудников today
, yesterday
и More than 2 days
[12,25,89]
, например,
12* joined today
25 joined yesterday
81 joined all prior to yesterday(2 day)
*
0, если для данного диапазона дат нет записей.
Комментарии:
1. Вы хотите получить информацию из отдела обработки данных?
2. @Popeye да, я хочу
data department wise
Ответ №1:
Вы бы использовали агрегацию для case
выражения:
select (case when joinedon::date = current_date then 'today'
when joinedon::date = current_date - interval '1 day' then 'yesterday'
when joinedon::date < current_date - interval '1 day' then 'older'
end) as grp,
count(*)
from t
group by grp;
Комментарии:
1. Как добавить значение по умолчанию
0
, если нет какой-либо записи, скажем, вtoday
качестве0
2. пробовал
coalesce(count(*),0)
, но не работает3. Это не тот вопрос, который вы задали здесь. Кстати,
count()
никогда не возвращаетсяNULL
, поэтомуcoalesce()
не нужно.
Ответ №2:
В дополнение к ответу @Gordon Linoff:
SELECT
days.day,
coalesce(t.cnt, 0) count
FROM (
SELECT * FROM (VALUES ('today'), ('yesterday'), ('older')) AS days (day)
)days
LEFT JOIN (
SELECT (CASE WHEN joinedon::date = current_date THEN 'today'
WHEN joinedon::date = current_date - interval '1 day' THEN 'yesterday'
WHEN joinedon::date < current_date - interval '1 day' THEN 'older'
end) as day,
count(*) cnt
FROM t
GROUP BY day
) t on t.day = days.day;
Протестируйте его здесь
Ответ №3:
Вы можете использовать group by
следующее:
select department,
(case when joinedon::date = current_date then 'today'
when joinedon::date = current_date - interval '1 day' then 'yesterday'
when joinedon::date < current_date - interval '1 day' then 'More than 2 days'
end) as grp,
Coalesce(count(*),0)
from t
group by grp, department;