[英]How to count rows matching a filter in aggregate operations
抱歉,标题不准时,这是我成功获得的最好成绩。
我有一张这样的桌子:
date | type | qty
2018-03-21 03:30:00 | A | 3
2018-03-22 03:30:00 | A | 3
2018-03-22 04:57:00 | A | 1
2018-03-22 05:18:00 | B | 3
我对此表进行了一些汇总,例如一天或一个月中的数量之和。 在同一查询中,我需要计算出B类型的行数,同时检索当天的总数量。
所以,
select sum(qty), date_trunc('day', date) ... group by date_trunc('day', date);
现在,我接下来要做的是计算B类型的行数。因此预期结果是
day | Bcount | totqty
2018-03-21 | 0 | 3
2018-03-22 | 1 | 7
我曾想使用分区,但不确定在这种特定情况下如何使用分区。
编辑:谢谢大家,你们的答案。 这太容易了🙄
使用case
表达式进行条件聚合 :
select ...
sum(case when type = 'B' then 1 else 0 end) as Bcount
...
从9.4版本开始,我们可以用新的FILTER clause
替换这些聚合函数中的CASE WHEN
FILTER clause
,请使用以下查询:
select date_trunc('day', date) AS Day,
Count(TYPE) filter (where Type = 'B') AS BCount,
Sum(qty) AS TotalQty
FROM Table1 group by date_trunc('day', date);
对于演示,请点击链接:
在Postgres 9.4发行之前 ,如果要在执行聚合函数时计算几组记录,则必须使用CASE WHEN
。 像这样:
SELECT date_trunc('day', date) AS Day,
SUM(CASE WHEN TYPE = 'B' THEN 1 ELSE 0 END) AS BCount,
Sum(qty) AS TotalQty
FROM Table1 group by date_trunc('day', date);
select date_trunc('day', date) ,sum(qty),
SUM (CASE WHEN type = 'B' THEN 1 ELSE 0 END) AS Bcount
FROM Table1
group by date_trunc('day', date);
演示版
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.