Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL表中基于枚举的主题的平均百分比_Mysql - Fatal编程技术网

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

我有一个MYSQL表,其中每一行都包含一个枚举选择的主题和学生在这些主题上的能力百分比。我想得到一个学生在该表中的平均百分比。我一直在尝试这样的事情:

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声明后面括号中的数字几乎完全没有意义,最好省略。