这是我第一次使用这个网站,所以我希望我能正确使用它。 我是使用PHP和MySql的新手,所以如果这是一个愚蠢的问题我很抱歉。
我想创建多个表格来保存有关多个游行乐队表演的数据。例如,我有一个名为" Attitude_Scores"包含以下列(id,student_id,performance_date,score)。其他表具有相同的列。例如,其他表是" Posture_Scores"," Instep_Scores"等
我在这个网站上找到了如何获得每个学生每个学生的平均分数:
SELECT student_id, AVG(score)
FROM Attitude_Scores
WHERE student_id = '1'
基本上,我想要的是获得" Attitude_scores"的平均值的全球平均值," Posture_Scores"的平均值," Instep_Scores&#的平均值34;例如,对于学生id = 1.学生1的全球平均值= AVG((平均态度_分数+平均姿势_分数+平均instep_score)/ 3)。很难解释。我希望它有点清楚。非常感谢您的帮助。
答案 0 :(得分:1)
根据公共密钥加入表格,按student_id分组,并使用avg(您想要的列)。如果您需要进一步的帮助,请告诉我。
例如,
SELECT student_id,
AVG(score),
AVG(whatever column)
FROM Attitude_Scores AS a
JOIN tablex AS x ON x.common_key = a.common_key
GROUP BY student_id
答案 1 :(得分:0)
尝试此查询。它应该为您提供个人平均值以及全球平均值。全球平均值的计算方法是将各个平均值乘以各自的得分(加权),然后对总数进行平均。
修改强>:
修改查询以根据(平均态度_分数+平均姿势_分数+平均instep_score)/ 3来计算全局平均值.SQL小提琴(参见末尾的链接)包含两个版本。
SELECT
student_id,
MAX(CASE Test WHEN 'Attitude' THEN avg_score ELSE 0 END) as Attitude_Average,
MAX(CASE Test WHEN 'Instep' THEN avg_score ELSE 0 END) as Instep_Average,
MAX(CASE Test WHEN 'Posture' THEN avg_score ELSE 0 END) as Posture_Average,
SUM(avg_score) / 3 Global_Average
FROM
(
SELECT 'Attitude' Test, student_id, COUNT(*) cnt_scores, AVG(score) as avg_score
FROM Attitude_Scores
GROUP BY student_id
UNION ALL
SELECT 'Instep', student_id, COUNT(*) cnt_scores, AVG(score) as avg_score
FROM Instep_Scores
GROUP BY student_id
UNION ALL
SELECT 'Posture', student_id, COUNT(*) cnt_scores, AVG(score) as avg_score
FROM Posture_Scores
GROUP BY student_id
) All_Scores
-- WHERE student_id = 1 Remove the comment if you want the data for only student_id = 1
GROUP BY student_id;
这是 SQL Fiddle demo 。