MYSQL表中基于枚举的主题的平均百分比
我有一个MYSQL表,其中每一行都包含一个枚举选择的主题和学生在这些主题上的能力百分比。我想得到一个学生在该表中的平均百分比。我一直在尝试这样的事情:MYSQL表中基于枚举的主题的平均百分比,mysql,Mysql,我有一个MYSQL表,其中每一行都包含一个枚举选择的主题和学生在这些主题上的能力百分比。我想得到一个学生在该表中的平均百分比。我一直在尝试这样的事情: SELECT sid, level, AVG(Percent) FROM 'PROGalphabet' group by (select DISTINCT level from PROGalphabet) where sid = 45 这是行不通的。很抱歉,它看起来像一个代码沙拉。 以下是该表的一个片段: CREATE TABLE 'PRO
SELECT sid, level, AVG(Percent) FROM 'PROGalphabet' group by (select DISTINCT level from PROGalphabet) where sid = 45
这是行不通的。很抱歉,它看起来像一个代码沙拉。
以下是该表的一个片段:
CREATE TABLE 'PROGalphabet' (
'rid' int(24) NOT NULL,
'sid' int(4) NOT NULL,
'date' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
'level' enum('Alphabet in Order','Point ABCs randomly','Tell ABCs randomly','knows phonics','starts reading') NOT NULL,
'Percent' tinyint(3) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO 'PROGalphabet' ('rid', 'sid', 'date', 'level', 'Percent') VALUES
(36, 45, '2019-01-20 15:51:42', 'Alphabet in Order', 61),
(37, 45, '2019-01-20 15:52:00', 'Alphabet in Order', 77),
(38, 45, '2019-01-20 15:57:11', 'Alphabet in Order', 85),
(51, 45, '2019-01-21 13:27:10', 'Alphabet in Order', 80),
(52, 45, '2019-01-21 13:37:27', 'Alphabet in Order', 67),
(54, 45, '2019-01-23 01:30:41', 'Alphabet in Order', 37),
(77, 45, '2019-01-29 02:10:57', 'Point ABCs randomly', 37),
(78, 45, '2019-01-29 02:10:59', 'Point ABCs randomly', 100),
(79, 45, '2018-12-12 06:46:22', 'starts reading', 1),
(80, 45, '2019-01-30 06:46:25', 'starts reading', 26),
(91, 45, '2019-04-11 16:00:00', 'starts reading', 60);
ALTER TABLE 'PROGalphabet'
ADD PRIMARY KEY ('rid'),
ADD KEY 'sid' ('sid');
ALTER TABLE 'PROGalphabet'
MODIFY 'rid' int(24) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=161;
COMMIT;
我得到了这个解决方案的帮助。但是,如果特定“sid”的“level”中的所有值都不存在,则查询的平均值将为off。该选项是为所有没有条目的“sid”设置“零”所有“级别”值
SELECT sid, ROUND(AVG(averagepercent),1) AS 'Overall Average %'
FROM
(
SELECT sid, LEVEL, AVG(Percent) AS 'averagepercent'
FROM `PROGalphabet` p2 WHERE sid = 45
GROUP BY sid, LEVEL
) p1
GROUP BY sid
是否有方法将SELECT DISTINCT level from PROGAPHABLE插入上述查询中,以说明所有可能的“级别”值?这将带来更准确的结果。您可以执行以下操作:
SELECT sid, COUNT(ttl) level_count, SUM(ttl) perc_sum,
SUM(ttl)/5 average_required, AVG(ttl) average_so_far
FROM (
SELECT sid,level, AVG(percent) ttl
FROM PROGalphabet
GROUP BY sid,level
) t
GROUP BY sid
内部选择将计算任何学生收到的每个等级的平均值,然后这些平均值将在外部选择中相加,并除以此处要求的等级总数:5以形成所需的平均值_列。列level_count通知您每个学生到目前为止可用的级别结果的数量,因此您可以轻松找到学生尚未获得所有级别结果的情况
最后一列average_so_计算到目前为止取得的所有水平成绩的平均值,而不必对缺失的水平进行处罚,这是一种更公平的方式来看待学生到目前为止的能力
您可以在这里找到一个小演示:
使用这样的扩展样本数据集
sid level percent
1 45 Alphabet in Order 61
2 45 Alphabet in Order 77
3 45 Alphabet in Order 85
4 45 Alphabet in Order 80
5 45 Alphabet in Order 67
6 45 Alphabet in Order 37
7 45 Point ABCs randomly 37
8 45 Point ABCs randomly 100
9 45 starts reading 1
10 45 starts reading 26
11 45 starts reading 60
12 5 Tell ABCs randomly 61
13 5 Alphabet in Order 77
14 5 Alphabet in Order 85
15 5 Alphabet in Order 80
16 5 Alphabet in Order 67
17 5 Alphabet in Order 57
18 5 Point ABCs randomly 67
19 5 Point ABCs randomly 80
20 5 knows phonics 75
21 5 starts reading 26
22 5 starts reading 60
您将得到以下结果:
sid level_count perc_sum average_required average_so_far
1 5 5 325.7000 65.14000000 65.14000000
2 45 3 165.3333 33.06666000 55.11110000
通过编辑问题显示样本数据的样本结果。不要忘记平均百分比的统计错误。。。。按级别分组,其中。。。可以。你需要只考虑最后一个学生答案的平均进度吗?任何带倒逗号的东西都是“字符串”,我最近一次又一次地看到这一点。INT声明后面括号中的数字几乎完全没有意义,最好省略。