2011-11-04 57 views
6

我花了很多时间搜索此信息,请让我知道是否重复。SQL:按表计数(*)作为总表行数的pct

我需要编写与每个类型分类中的计数返回记录的类别分组查询。像这样的:

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。

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

回答

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; 
+0

这比原来更复杂,但它会跑得更快吗?这种类型的查询有很多潜在的应用程序,感谢指针! –

+0

好吧,如果'categorynum'的值相对于'tbl'中的行数很少,那么大部分工作都将在子查询中完成。如果不同'categorynums'相对于'tbl'中行数的比例相对较高,那么'sum'可能会让你减慢太多。我会通过两个查询的'explain'来检查查询计划。你非常欢迎。 :) – 2011-11-04 16:19:56

1

你也可以做餐桌上的COUNT(*)作为一个单独的查询,然后加入与在原始查询FROM SELECT语句的一部分。这应该比把它放在SELECT部分​​更快。

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

谢谢,这是我以前唯一的选择...事情是这张桌子总是获取数据添加到它,而且我宁愿有一个单一的查询比运行两个查询,然后键入数字放入计算器/电子表格中以获取百分比。 –

+0

我认为回答者有一个单一的查询......我会写一个建议到可读的答案中。 – araqnid

+0

尽管我刚刚添加的示例在问题中并没有比您的示例更高效,但它们都会导致表格的两次完整扫描。啊,这些东西只有通过尝试才能真正学到。 – araqnid