[英]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.