使用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中文网其他相关文章!