PostgreSQL – 如何在此查询中显示count = 0?

shelter_inventory(表)

gid | pav_type | yes
 1  |  1       | 1
 2  |  1       | 1
 3  |  0       | 1
 4  |  2       | 1 
 5  |  2       | 0

这是当前查询(不显示count = 0)

SELECT pav_type,count(*) FROM shelter_inventory 
WHERE yes = 1 GROUP BY pav_type ORDER BY pav_type

我希望结果显示如下

pav_type | count(*)
 0       |  1
 1       |  2
 2       |  1 
 3       |  0

我怎么能查询这个案子?我使用Postgresql.

解决方法

如果您的pav_type值是顺序的,那么您可以使用 generate_series代替外部表:

select p.pav_type,count(yes)
from generate_series(0,3) as p(pav_type)
left outer join shelter_inventory s
  on p.pav_type = s.pav_type and s.yes = 1
group by p.pav_type
order by p.pav_type

这会产生:

pav_type | count 
----------+-------
        0 |     1
        1 |     2
        2 |     1
        3 |     0

这个:

generate_series(0,3) as p(pav_type)

本质上生成一个内联表,其中包含一个名为pav_type的列和四行:0,1,2,3.您需要在连接条件(而不是WHERE)中使用s.yes = 1,因为您需要yes = 0值应在预先分组的结果集中;如果s.yes = 1在WHERE子句中,那么无论连接条件是什么,都不会计算yes = 0行.

如果你的pav_types不能很好地适应generate_series(即不是顺序或步骤顺序)而你只有少数几个,你可以加入到VALUES expression

select p.pav_type,count(yes)
from (values (0),(1),(2),(3)) as p(pav_type)
left outer join shelter_inventory s
  on p.pav_type = s.pav_type and s.yes = 1
group by p.pav_type
order by p.pav_type

您需要确保在正确的位置获得所有括号.

如果你在单独的表中有pav_types,那么对该表执行LEFT OUTER JOIN而不是使用generate_series.如果您的pav_types不是顺序的,并且您有太多不明智地放入VALUES表达式,那么构建一个表来保存有效的pav_type值和LEFT OUTER JOIN.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...