首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgresql上按组计数

在Postgresql上按组计数
EN

Stack Overflow用户
提问于 2019-05-26 12:11:12
回答 2查看 465关注 0票数 1

我有一个postgresql类型和一个表

代码语言:javascript
复制
CREATE TYPE mem_status AS ENUM('waiting', 'active', 'expired');

CREATE TABLE mems (
  id BIGSERIAL PRIMARY KEY,
  status mem_status NOT NULL
);

数据集

代码语言:javascript
复制
INSERT INTO mems(id, status) VALUES
  (1, 'active'), (2, 'active'), (3, 'expired');

我想查询按状态分组的计数。因此,我遍历了下面的查询。

代码语言:javascript
复制
WITH mem_statuses AS (
  SELECT unnest(enum_range(NULL::mem_status)) AS status
)
SELECT m.status, count(1)
  FROM mems m
  RIGHT JOIN mem_statuses ms ON ms.status = m.status
  GROUP BY m.status;

但如果没有waiting微机电系统,结果如下所示。

代码语言:javascript
复制
status     |  count  
================
NULL       |  1      <- problem
'active'   |  2
'expired'  |  1

我想得到这样的结果。

代码语言:javascript
复制
status     |  count  
================
'waiting'  |  0
'active'   |  2
'expired'  |  1

我怎么能这么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-27 01:22:43

使用count(id)

代码语言:javascript
复制
WITH mem_statuses AS (
  SELECT unnest(enum_range(NULL::mem_status)) AS status
)
SELECT ms.status, count(id)
  FROM mems m
  RIGHT JOIN mem_statuses ms ON ms.status = m.status
  GROUP BY ms.status;

或者:

代码语言:javascript
复制
select status, count(id)
from unnest(enum_range(null::mem_status)) as status
left join mems using(status)
group by status


 status  | count 
---------+-------
 waiting |     0
 active  |     2
 expired |     1
(3 rows)

文献资料 count(expression)给出

表达式值不为空的输入行数

票数 0
EN

Stack Overflow用户

发布于 2019-05-27 01:33:03

你需要修改连接并聚合一点-

代码语言:javascript
复制
select ms.status, count(m.status)
from (select unnest(enum_range(null::mem_status))) as ms(status)
left join mems as m
  on ms.status = m.status
group by ms.status;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56313377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档