使用SQL計算不同pass的平均值
在MySQL中,透過AVG和GROUP BY可以實現對資料分組檢索平均值功能。但是,當處理多個條件時,例如計算特定列的不同值的平均值,任務會變得稍微複雜一些。
在這種情況下,目標是提取“val”列的平均值對於每個唯一的“id”,對應不同的“pass”值,範圍可能從 1 到 7。
子查詢解
一種方法是使用子查詢AVG 函數中「pass」的每個值。這將為每個“id”和“pass”組合傳回一組值。
<code class="sql">SELECT d1.id, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 1) as val_1, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 2) as val_2, [...] (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 7) as val_7 from data_r1 d1 GROUP BY d1.id</code>
此查詢首先從「data_r1」表中取得唯一的「id」值。然後,對於每個“id”,它執行七個子查詢來計算“pass”每個可能值的平均值,並將它們儲存為單獨的“val_n”列。 IFNULL 函數用於處理子查詢傳回 NULL 值的任何情況,確保結果是數字或零。
這種方法的優點是它為每個「id」傳回一行,使處理結果變得更加容易。然而,它可能有點冗長,特別是當「pass」有很多可能的值時。
替代方法
如果您喜歡更簡潔的方法,您可以使用GROUP BY 和CASE 語句的組合來實現類似的結果:
<code class="sql">SELECT id, SUM(CASE WHEN pass = 1 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 1 THEN id END) AS val_1, SUM(CASE WHEN pass = 2 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 2 THEN id END) AS val_2, [...] SUM(CASE WHEN pass = 7 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 7 THEN id END) AS val_7 FROM data_r1 GROUP BY id</code>
此查詢使用多個CASE 語句來計算'pass' 值,並且在計算中僅包含對應的'val' 值。分母中的 COUNT(DISTINCT ...) 表達式可確保正確計算平均值,即使特定「id」和「pass」組合有多個「val」值也是如此。
再一次, IFNULL 函數可用於處理除法結果為 NULL 的任何情況,以確保輸出是數字或零。
無論您選擇哪種方法,這些查詢都將有效提取 的平均「val」值「data_r1」表中「pass」的不同值的每個唯一「id」。
以上是如何在 MySQL 中使用 SQL 計算不同遍的平均值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!