我花了很多时间搜索这个,如果重复,请告诉我。
我需要编写一个分组查询,该查询返回记录类别以及每种类别的计数。像这样:
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,如果尽可能。
那么有更好的方法来写这个吗?这是我经常遇到的情况,所以我想正确地编写我的查询。
答案 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