2011-05-30 122 views
1
SELECT User, COUNT(*) as count FROM Tests WHERE Release = '1.0' GROUP by User; 

上述查询将返回不同的数字,但是,我想将计数转换为与总记录数相关的百分比。考虑WHERE子句的记录总数。在SQL查询中计算行内百分比

回答

2
SELECT R1.user, COUNT(*)/R2.COUNT_ALL AS Expr1 
    FROM Releases R1, 
     (SELECT COUNT(*) As COUNT_ALL FROM Releases WHERE Release = '1.0') R2 
WHERE R1.Release = '1.0' 
GROUP BY R1.user, R2.COUNT_ALL 
1

这是一个使用一个SELECT另一种方法:

SELECT 
    Tests.User, 
    Count(IIf([Tests].[Release]='1.0', 1, Null))/Count(*) AS Percentage 
FROM 
    Tests 
GROUP BY 
    Tests.User 

与早期建议的方法,这种人会,是好还是坏,返回记录在测试有没有记录用户在那里发布是“1.0”。如果你不想要这些记录,你可以添加一个HAVING子句来消除它们。

希望这会有所帮助。

-2

像Brian的答案,但在标准SQL而不是MS Access中。 (你也可以使用COUNT代替SUMNULL在那里我有0。)

SELECT 
    Tests.User, 
    Sum(CASE WHEN Release='1.0' THEN 1 ELSE 0 END)/Count(*) AS Percentage 
FROM 
    Tests 
GROUP BY 
    Tests.User 
+0

它是如何有用的不数据库引擎中的实际问题的工作答案吗?包含Access/Jet/ACE解决方案并提供非Access方法是一回事,但我没有看到这个答案在这里添加了任何有用的东西 - 它只会混淆人们正在寻找适用于Access/Jet/ACE的解决方案。 – 2011-05-30 22:41:07

+2

已被删除的答案badmouths访问涉嫌不支持PARTITION BY,但事实是,Access/Jet/ACE SQL确实有一个可能在这里工作的Partition()函数(我不确定它是否存在)。绝对值得阅读它的帮助文件,就像几年前我第一次遇到它时那样,我很惊讶它存在。 – 2011-05-30 22:43:36

+0

@ David-W-Fenton:因为某人有可能在搜索中点击此页面,这就是为什么,而Access-only解决方案对他们没有任何好处。 AFAIK,标准的SQL CASE语句也适用于Access,因此更为可取。 – 2011-05-31 02:48:21