我正在尝试过滤这样的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个不同的值:finished
,in_process
和new
问题:有些值可能没有记录,那么如何对所有可能的状态值进行分组查询?
我当前的查询是
select status, count(status)
from tasks
group by status
答案 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