2014-05-02 185 views
1

這是我第一次使用這個網站,所以我希望我能正確使用它。 我對使用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」的平均值以及例如學生id = 1的「Instep_Scores」的平均值。學生1的全球平均值= AVG((average_scores + average posture_scores +平均instep_score)/ 3)。很難解釋。我希望它有點清楚。你的幫助將不勝感激。

+0

多個表?你確定這是個好主意嗎? – Strawberry

+1

求平均值通常是一個糟糕的主意。 –

回答

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 
0

嘗試此查詢。它應該爲您提供個人平均數以及全球平均數。全球平均值的計算方法是將各個平均值乘以相應的得分計數(加權),然後對總計進行平均。

編輯

修改查詢基礎上(平均attitude_scores +平均posture_scores +平均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