首页  >  文章  >  数据库  >  如何在 MySQL 中使用 SQL 计算不同遍的平均值?

如何在 MySQL 中使用 SQL 计算不同遍的平均值?

Linda Hamilton
Linda Hamilton原创
2024-10-30 18:50:30928浏览

How to Calculate Average Values for Different Passes Using SQL in MySQL?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn