我有下表
id | created_on | is_a | is_b | is_c
----------------------------------------------
1 | 01-02-1999 | True |False |False
2 | 23-05-1999 | False |True |False
3 | 25-08-2000 | False |True |False
4 | 30-07-2000 | False |False |True
5 | 05-09-2001 | False |False |True
6 | 05-09-2001 | False |True |False
7 | 05-09-2001 | True |False |False
8 | 05-09-2001 | True |False |False
在生成查询的表中,我希望按创建年份分组,然后能够比较每个年份创建了多少条记录 is_a
以及 is_b
. 我想从伯爵那里完全忽略 is_c
.
count_a | count_b | by_creation_year
-----------------------------------------------
1 |1 | 1999
0 |1 | 2000
2 |1 | 2001
我尝试了以下查询:
select count(is_a = True) a,
count(is_b = True) b,
date_trunc('year', created_on)
from cp_all
where is_c = False -- this removes the records where is_c is True
group by date_trunc('year', created_on)
order by date_trunc('year', created_on) asc;
但是我得到了一张a和b的计数完全相同的表。
3条答案
按热度按时间9wbgstp71#
虽然我喜欢filter,但它的类型更简单:
r3i60tvu2#
你的
count()
参数的计算结果为true
或者false
每一个都算作1
不管怎样。你想用
filter
```select count() filter (where is_a) a,
count() filter (where is_b) b,
date_trunc('year', created_on)
from cp_all
where is_c = False -- this removes the records where is_c is True
group by date_trunc('year', created_on)
order by date_trunc('year', created_on) asc;
t3psigkw3#
那是因为
count
不接受布尔表达式它只是使用表达式并计算以检查它是否为布尔表达式null
或者not null
添加到计数器。所以在这种情况下你应该使用sum
与case
```select sum(case when is_a then 1 else 0 end) a,
sum(case when is_b then 1 else 0 end) b,
date_trunc('year', created_on)
from cp_all
where is_c = False -- this removes the records where is_c is True
group by date_trunc('year', created_on)
order by date_trunc('year', created_on) asc;