我有一个SQL Server表,包含用户和他们的成绩。为了简单起见,我们只说有两列——姓名和年级。所以一个典型的行是:名字:“John Doe”,等级:“a”。

我正在寻找一个SQL语句,将找到所有可能的答案的百分比。(A, B, C,等等…)此外,有没有一种方法可以在不定义所有可能答案的情况下做到这一点(打开文本字段-用户可以输入“通过/失败”,“none”等…)

我想要的最终输出是A: 5%, B: 15%, C: 40%等等……


当前回答

以下操作应该可以工作

ID - Key
Grade - A,B,C,D...

编辑:移动* 100并添加1.0以确保它不做整数除法

Select 
   Grade, Count(ID) * 100.0 / ((Select Count(ID) From MyTable) * 1.0)
From MyTable
Group By Grade

其他回答

当我需要计算一个百分比时,我简单地使用这个。

ROUND(CAST((Numerator * 100.0 / Denominator) AS FLOAT), 2) AS Percentage

请注意,100.0返回一个小数,而100本身将把结果四舍五入到最接近的整数,即使使用round(…,2)函数!

最有效的(使用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;

我已经测试了以下内容,这确实有效。戈迪伊的答案很接近,但在错误的位置上乘了100,并且缺少了一些括号。

Select Grade, (Count(Grade)* 100 / (Select Count(*) From MyTable)) as Score
From MyTable
Group By Grade
SELECT Grade, GradeCount / SUM(GradeCount)
FROM (SELECT Grade, COUNT(*) As GradeCount
      FROM myTable
      GROUP BY Grade) Grades

以下操作应该可以工作

ID - Key
Grade - A,B,C,D...

编辑:移动* 100并添加1.0以确保它不做整数除法

Select 
   Grade, Count(ID) * 100.0 / ((Select Count(ID) From MyTable) * 1.0)
From MyTable
Group By Grade