簡體   English   中英

如何在聚合操作中計算與過濾器匹配的行

[英]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);

對於演示,請點擊鏈接:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM