多个表中的平均值

时间:2014-05-02 17:43:13

标签: php mysql sql sql-server

这是我第一次使用这个网站,所以我希望我能正确使用它。 我是使用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)。很难解释。我希望它有点清楚。非常感谢您的帮助。

2 个答案:

答案 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