我有一个SQL Server表,包含用户和他们的成绩。为了简单起见,我们只说有两列——姓名和年级。所以一个典型的行是:名字:“John Doe”,等级:“a”。
我正在寻找一个SQL语句,将找到所有可能的答案的百分比。(A, B, C,等等…)此外,有没有一种方法可以在不定义所有可能答案的情况下做到这一点(打开文本字段-用户可以输入“通过/失败”,“none”等…)
我想要的最终输出是A: 5%, B: 15%, C: 40%等等……
我有一个SQL Server表,包含用户和他们的成绩。为了简单起见,我们只说有两列——姓名和年级。所以一个典型的行是:名字:“John Doe”,等级:“a”。
我正在寻找一个SQL语句,将找到所有可能的答案的百分比。(A, B, C,等等…)此外,有没有一种方法可以在不定义所有可能答案的情况下做到这一点(打开文本字段-用户可以输入“通过/失败”,“none”等…)
我想要的最终输出是A: 5%, B: 15%, C: 40%等等……
当前回答
你们需要在成绩领域分组。这个查询应该为您提供在几乎任何数据库中要查找的内容。
Select Grade, CountofGrade / sum(CountofGrade) *100
from
(
Select Grade, Count(*) as CountofGrade
From Grades
Group By Grade) as sub
Group by Grade
您应该指定您正在使用的系统。
其他回答
你必须计算总分 如果是SQL 2005,可以使用CTE
WITH Tot(Total) (
SELECT COUNT(*) FROM table
)
SELECT Grade, COUNT(*) / Total * 100
--, CONVERT(VARCHAR, COUNT(*) / Total * 100) + '%' -- With percentage sign
--, CONVERT(VARCHAR, ROUND(COUNT(*) / Total * 100, -2)) + '%' -- With Round
FROM table
GROUP BY Grade
当我需要计算一个百分比时,我简单地使用这个。
ROUND(CAST((Numerator * 100.0 / Denominator) AS FLOAT), 2) AS Percentage
请注意,100.0返回一个小数,而100本身将把结果四舍五入到最接近的整数,即使使用round(…,2)函数!
您可以使用没有“partition by”子句的窗口函数,而不是使用单独的CTE来获得总数。
如果你正在使用:
count(*)
要获得一个组的计数,您可以使用:
sum(count(*)) over ()
来获得总数。
例如:
select Grade, 100. * count(*) / sum(count(*)) over ()
from table
group by Grade;
根据我的经验,它往往更快,但我认为在某些情况下它可能在内部使用临时表(我在运行“set statistics io on”时看到过“Worktable”)。
编辑: 我不确定我的示例查询是否是你要找的,我只是说明了窗口函数是如何工作的。
你们需要在成绩领域分组。这个查询应该为您提供在几乎任何数据库中要查找的内容。
Select Grade, CountofGrade / sum(CountofGrade) *100
from
(
Select Grade, Count(*) as CountofGrade
From Grades
Group By Grade) as sub
Group by Grade
您应该指定您正在使用的系统。
最有效的(使用over())。 count(*) * 100.0 / sum(count(*)) over() 从MyTable 按年级分组 通用(任何SQL版本)。 select count(*) * 100.0 / (select count(*) from MyTable) 从MyTable 按年级分组; CTE的效率最低。 用t(Grade, GradeCount) 作为 ( select Grade, count(*) 从MyTable 按年级分组 ) (select sum(GradeCount) from t) 从t;