2010-06-15 20 views
1

我对SQL查询有点新,而且我正在为这个特定问题而苦苦挣扎。 比方说,我已经查询返回下面3条记录(保存为简单一列):
汤姆
杰克
汤姆通过它们的出现比例检索名称

而且我希望有由名称分组的结果,也包括部分(比例)该名称出现在返回的总记录中。

所以,期望的结果将是(如两列):
Tom | 2/3
Jack | 1/3

我该怎么办?确定分子非常简单(我可以使用COUNT()和GROUP BY名称),但是我无法将其转换为返回总行数中的比例。

任何帮助非常感谢!

回答

3
SELECT name, COUNT(name)/(SELECT COUNT(1) FROM names) FROM names GROUP BY name; 
+0

那么,在我的情况下,“名称”部分实际上是它自己的长查询。我必须复制并粘贴整个子查询才能在通用查询中出现两次吗?或者有什么办法可以做到:“SELECT name,COUNT(name)/(SELECT COUNT(1)FROM(SELECT ...)AS my_subquery)FROM my_subquery GROUP BY name;” ?如果有,我似乎无法得到正确的语法。 – 2010-06-15 22:13:21

+0

此外,您提供的查询结构工作,但我不得不将“COUNT(1)”更改为“CAST(COUNT(1)AS float”,否则它会进行整数除法并返回全零。 – 2010-06-15 22:37:21

1

由于分母是固定的,“比例”与分子成正比。除非你真的需要显示分母,这将是一个容易得多,只是使用类似:

select name, count(*) from your_table_name 
group by name 
order by count(*) desc 

,你会得到正确的顺序正确的数据,但是这显示的数字会是计数而不是比率。

如果你真的想要这个分母,你可以在同一个select的非分组版本上做count(*) - 但是取决于选择需要多长时间,这可能会很慢。

+0

那么,我想要的比例,而不是纯粹的计数的原因是因为我使用我的数据过滤器。也就是说,如果它只占返回记录的一半以上,我只想返回“汤姆”。否则,我认为它只是噪音。有没有更好的方法来解决这个问题?也许我应该在我的应用程序代码中这样做? – 2010-06-15 22:25:33

+0

@jjiffer:或许一个近似的答案会很有用?只有*一个*组可能构成超过一半的记录,所以也许你可以返回最高记录的记录?这不一定会超过记录的一半,但也许它足够接近您的目的? – 2010-06-15 23:53:53

+0

这是一个很好的观点,但如果没有答案“足够令人信服”,我也可以选择不做任何回答。我可能会稍微调整一下,比较计算时间和使用粗糙逼近的准确性,并看看未来会出现什么技术。谢谢你的帮助! – 2010-06-16 13:44:20

相关问题