在MySQL中使用不同的比例计算平均成绩

时间:2011-05-12 16:14:29

标签: php mysql average

我想计算MySQL表中一堆行的平均等级。问题是,根据您登录的用户,可能会使用不同的比例。

示例比例可以是:

  • 1-5
  • 1-10
  • A-F(显然不包括E)

在数字刻度中,数字越大越好,但在字母尺度上越低越好。

如何创建SQL查询以提供正确的平均值?

平均值示例:

  • 5,5,4,2 = 4
  • 8,10,7,6,4 = 7
  • A,A,C = B
  • A,F,B,B = C
  • F,F,B,D = D

我使用的查询是:

SELECT CHAR(ROUND(AVG(ORD(UPPER(grade))))) AS average

这里的问题是最后一个例子。使用该查询后出现E,但这不是有效等级,应为D

我不知道如何处理这件事。如果规模排除了值(例如A-F等级不包括E),那么获得MySQL平均等级的最佳方法是什么?如果需要,我可以在PHP中计算它。

2 个答案:

答案 0 :(得分:1)

使用字母和值之间的映射创建另一个表,连接一次以获取当前字母的值,然后再次连接它以将平均值转换回字母。

答案 1 :(得分:1)

如果不进行看起来像spaghetti的SQL查询,最好的方法是创建一个带有grade->等级点值的映射表。

Table Values
grade  value
    A | 4
    B | 3
    C | 2
    etc.

然后,你会做平均值

SELECT ROUND(AVG(v.value)) FROM Grades g 
           INNER JOIN Values v on g.grade = v.grade

然后,您可以加入表格以获得结果

SELECT * FROM (
     SELECT ROUND(AVG(grade)) avg FROM Grades g 
               INNER JOIN Values v on g.value = v.value
             ) avgs 
INNER JOIN Values v2 on avgs.avg = v2.values