получить список подсчетов из таблицы на основе дат в sql

#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;