如何计算与聚合操作中的筛选器匹配的行

时间:2018-03-29 10:56:15

标签: sql postgresql

对于非准时的标题抱歉,这是我成功获得的最佳标题。

我有一张这样的表:

       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

我想使用分区,但我不确定如何在这种特定情况下使用它们。

编辑:谢谢大家,伙计们,谢谢你的回答。这真是太容易了

3 个答案:

答案 0 :(得分:1)

使用case表达式执行条件聚合

select ...
       sum(case when type = 'B' then 1 else 0 end) as Bcount
...

答案 1 :(得分:1)

自9.4发布以来,我们可以使用新的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);

演示请点击链接:

  

http://sqlfiddle.com/#!17/a5203/14

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);

答案 2 :(得分:1)

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);

演示

  

http://sqlfiddle.com/#!17/a5203/13