计算不包括 0 值的列
Counting columns excluding 0 value
我有以下数据(实际上跨越多年,但对于这个例子,我只包括 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
只需使用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
您可以使用 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
你还需要使用 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
我有以下数据(实际上跨越多年,但对于这个例子,我只包括 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
只需使用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
您可以使用 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
你还需要使用 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