按年份分组和布尔列postgres

djmepvbi  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(370)

我有下表

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的计数完全相同的表。

9wbgstp7

9wbgstp71#

虽然我喜欢filter,但它的类型更简单:

select sum(is_a::int) as a, 
       sum(is_b::int) as 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;
r3i60tvu

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;

这样做你就不需要 `where` 条款。
t3psigkw

t3psigkw3#

那是因为 count 不接受布尔表达式它只是使用表达式并计算以检查它是否为布尔表达式 null 或者 not null 添加到计数器。所以在这种情况下你应该使用 sumcase ```
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;

相关问题