Подсчет столбцов без учета значения 0

#sql #datetime #count #amazon-redshift #distinct

#sql #дата и время #подсчет #amazon-redshift #различное

Вопрос:

У меня есть следующие данные (на самом деле они охватывают годы, но для этого примера я включил только 4 месяца)

 id  created_at  staff
--------------------------------
1   2010-01-01  Coder
2   2010-01-15  Developer
3   2010-03-01  Data Analyst
4   2010-01-20  Developer
5   2010-03-13  Data Analyst
6   2010-04-05  Tester
7   2010-04-01  Tester
8   2010-04-04  Business Analyst
9   2010-01-22  Business Analyst
10  2010-01-25  Coder
 

Затем я использую следующий запрос для подсчета персонала по месяцам.

 select staff,
    sum(case when date_trunc('month', created_at) = date '2010-01-01' then 1 else 0 end) as cnt_2010_01,
    sum(case when date_trunc('month', created_at) = date '2010-02-01' then 1 else 0 end) as cnt_2010_02,
    sum(case when date_trunc('month', created_at) = date '2010-03-01' then 1 else 0 end) as cnt_2010_03,
    sum(case when date_trunc('month', created_at) = date '2010-04-01' then 1 else 0 end) as cnt_2010_04
from mytable
group by staff
 

Ниже приведен пример вывода, который выдает приведенный выше SQL.

 staff               2010-01   2010-02   2010-03   2010-04   
----------------------------------------------------------
Coder               2         0         0         0
Developer           2         0         0         0
Data Analyst        0         0         2         0
Tester              0         0         0         2
Business Analyst    1         0         0         1
 

Сейчас я пытаюсь подсчитать количество столбцов, которые имеют значение. Ожидаемый результат, к которому я стремлюсь, это

 staff               months   2010-01   2010-02   2010-03   2010-04  
--------------------------------------------------------------------------
Coder               1        2         0         0         0
Developer           1        2         0         0         0
Data Analyst        1        0         0         2         0
Tester              1        0         0         0         2
Business Analyst    2        1         0         0         1
 

Ответ №1:

вам также необходимо использовать count(distinct):

 select staff,
    count(distinct date_trunc('month', created_at)) as months
    sum(case when date_trunc('month', created_at) = date '2010-01-01' then 1 else 0 end) as cnt_2010_01,
    sum(case when date_trunc('month', created_at) = date '2010-02-01' then 1 else 0 end) as cnt_2010_02,
    sum(case when date_trunc('month', created_at) = date '2010-03-01' then 1 else 0 end) as cnt_2010_03,
    sum(case when date_trunc('month', created_at) = date '2010-04-01' then 1 else 0 end) as cnt_2010_04
from mytable
group by staff
 

Комментарии:

1. Спасибо @PRIN, теперь я чувствую себя довольно глупо из-за того, насколько это было просто… Кстати, вам не хватает закрывающей круглой скобки после created_at

Ответ №2:

Просто используйте count(distinct) :

 select staff,
       count(distinct date_trunc('month', created_at)) as num_months,
       sum(case when date_trunc('month', created_at) = date '2010-01-01' then 1 else 0 end) as cnt_2010_01,
       sum(case when date_trunc('month', created_at) = date '2010-02-01' then 1 else 0 end) as cnt_2010_02,
       sum(case when date_trunc('month', created_at) = date '2010-03-01' then 1 else 0 end) as cnt_2010_03,
       sum(case when date_trunc('month', created_at) = date '2010-04-01' then 1 else 0 end) as cnt_2010_04
from mytable
group by staff
 

Ответ №3:

Вы можете просто посчитать отдельные месяцы с помощью count(distinct) :

 select staff,
    count(distinct date_trunc('month', created_at)) as cnt_month,
    sum(case when date_trunc('month', created_at) = date '2010-01-01' then 1 else 0 end) as cnt_2010_01,
    sum(case when date_trunc('month', created_at) = date '2010-02-01' then 1 else 0 end) as cnt_2010_02,
    sum(case when date_trunc('month', created_at) = date '2010-03-01' then 1 else 0 end) as cnt_2010_03,
    sum(case when date_trunc('month', created_at) = date '2010-04-01' then 1 else 0 end) as cnt_2010_04
from mytable
group by staff