在 mySQL 中结合 avg() 和 if() 函数“Avg(if())”

问题描述 投票:0回答:1

我有下表:

|s.userid | c.用户ID | c.行动|

|3 | 3 |超时| |3 | 3 |超时| |7 | 7 |已确认| |7 | 7 |已确认| |7 | 7 |已确认| |2 | 2 |超时| |2 | 2 |已确认|

对于给定的 s.user_id,我正在尝试计算 计数(已确认)/(计数(已确认)+计数(超时))

所以最终结果应该是这样的: |s.userid |率 |


| 3 | 0 | | 7 | 1 | | 2 | 0.5 |

我看到了一个使用以下查询的解决方案: 选择 s.user_id, avg(if(c.action = 'confirmed', 1, 0)) 作为来自 tablename group by s.user_id;

的费率

我知道 avg() 函数接受一个表达式,而 if() 函数根据条件返回值。我不明白这个查询在内部是如何工作的。如果 if() 函数返回一个值,并且 avg() 函数需要一个数字列,那么此查询中操作的逻辑顺序是什么?

sql mysql
1个回答
1
投票

使用条件聚合我们可以尝试:

SELECT
    user_id,
    SUM(action = 'confirmed') / SUM(action IN ('confirmed', 'timeout')) AS ratio
FROM yourTable
ORDER BY user_id;

如果给定用户可能既没有确认也没有超时操作,那么上面的结果将除以零。在这种情况下,假设您希望将比率报告为零,我们可以使用案例逻辑:

SELECT
    user_id,
    CASE WHEN SUM(action IN ('confirmed', 'timeout')) > 0
         THEN SUM(action = 'confirmed') / SUM(action IN ('confirmed', 'timeout'))
         ELSE 0
    END AS ratio
FROM yourTable
ORDER BY user_id;
© www.soinside.com 2019 - 2024. All rights reserved.