SQL:按计数(*)分组为总表行数的pct

时间:2011-11-04 15:04:07

标签: sql postgresql

我花了很多时间搜索这个,如果重复,请告诉我。

我需要编写一个分组查询,该查询返回记录类别以及每种类别的计数。像这样:

select categorynum, count(*) from tbl group by categorynum;

到目前为止一切顺利。现在我需要的是确定每个类别的总数占总数的百分比。我想出的最好的是这个,我不喜欢,感觉很脏:

select categorynum, count(*), count(*)/(select count(*) from tbl) from tbl group by categorynum;

它有效,但我真的唠叨这样做。我使用的数据库是Postgres语法兼容的,并且表上的count(*)非常快,所以在表上执行count(*)没有大的速度,尽管我想编写更好的SQL,如果尽可能。

那么有更好的方法来写这个吗?这是我经常遇到的情况,所以我想正确地编写我的查询。

2 个答案:

答案 0 :(得分:5)

由于PostgreSQL支持窗口函数,你可以这样做:

select categorynum,count,100*count/(sum(count) over ())::numeric as count_pct
from(
    select categorynum,count(1)
    from tbl
    group by categorynum
)a;

答案 1 :(得分:1)

您还可以将表上的count(*)作为单独的查询执行,然后将其与原始查询一起连接到SELECT语句的FROM部分。这应该比把它放在SELECT部分​​更快。

select categorynum, categorycount, total
from (select categorynum, count(*) as categorycount
      from tbl
      group by categorynum) categories,
     (select count(*) as total from tbl) totals