在字符串分组值中显示零

时间:2020-04-11 22:18:42

标签: mysql sql group-by count grouping

我正在尝试过滤这样的sql表:

| status     | name   | description       |  
|------------|--------|-------------------|  
| finished   | task 1 | finished task 1   |  
| finished   | task 2 | finished task 2   |  
| in_process | task 3 | in process task 1 |  

但是状态列可以有3个不同的值:finishedin_processnew 问题:有些值可能没有记录,那么如何对所有可能的状态值进行分组查询?

我当前的查询是

select status, count(status)
from tasks
group by status

1 个答案:

答案 0 :(得分:2)

一种选择是列出所有可能的状态值,然后用left join带该表。

例如:

select s.status, count(t.status) no_status
from (
    select 'finished' status
    union all select 'in_process'
    union all select 'new'
) s
left join mytable t on t.status = s.status
group by s.status

某些数据库具有更简洁的方法来声明状态的派生表,例如values()表的构造函数:

select s.status, count(t.status) no_status
from (values ('finished'), ('in_process'), ('new')) s(status)
left join mytable t on t.status = s.status
group by s.status

您也可以使用select distinct直接从表中获取值(尽管效率较低,因为这需要对原始表进行额外的扫描并进行重复数据删除):

select s.status, count(t.status) no_status
from (select distinct status from mytable) s
left join mytable t on t.status = s.status
group by s.status

在理想情况下,您将具有一个引用表来存储所有可能的状态值,例如statuses(status)

select s.status, count(t.status) no_status
from statuses s
left join mytable t on t.status = s.status
group by s.status
相关问题