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

Gab*_*ana 6 sql postgresql

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

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

select categorynum, count(*) from tbl group by categorynum;
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在我需要的是确定每个类别的总数占总数的百分比.我想出的最好的是这个,我不喜欢,感觉很脏:

select categorynum, count(*), count(*)/(select count(*) from tbl) from tbl group by categorynum;
Run Code Online (Sandbox Code Playgroud)

它有效,但是我真的唠叨这样做.我使用的数据库是Postgres语法兼容的,并且count(*)在一个表上非常快,所以count(*)在桌子上做一个没有巨大的速度,尽管我想尽可能写出更好的SQL.

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

小智 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;
Run Code Online (Sandbox Code Playgroud)