如何将算术运算应用于 MySQL 中的聚合列?

Jos*_*h.F 4 mysql sql group-by aggregate

TL; 博士

有没有办法在算术运算中使用聚合结果?

细节

我想取两个聚合列 ( SUM(..), COUNT(..)) 并将它们一起操作,例如:

-- doesn't work
SELECT 
    SUM(x) AS x, 
    COUNT(y) AS y, 
    (x / y) AS x_per_y -- Problem HERE
FROM
    my_tab
GROUP BY groupable_col;
Run Code Online (Sandbox Code Playgroud)

这不起作用,但我发现这样做:

SELECT 
    SUM(x) AS x, 
    COUNT(y) AS y, 
    SUM(x) / COUNT(y) AS x_per_y -- notice the repeated aggregate
FROM
    my_tab
GROUP BY groupable_col;
Run Code Online (Sandbox Code Playgroud)

但是如果我需要对聚合进行操作的许多列,它很快就会变得非常重复,而且我不确定如何判断 MySQL 是否可以优化,以便我不会多次计算聚合。

我已经搜索了一段时间,并询问了一些专业人士,我能想到的最佳选择是嵌套选择,~~我的数据库不支持。~~

编辑:确实支持他们,我一直在做错事,并过早地排除了嵌套选择

此外,MySQL 文档似乎支持它,但我无法让这样的东西工作(链接最底部的示例)

https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html

Gur*_*ngh 5

一种方法是使用子查询:

select x,
    y,
    x / y as x_per_y
from (
    select SUM(x) as x,
        COUNT(y) as y
    from my_tab
    group by groupable_col
    ) t
Run Code Online (Sandbox Code Playgroud)

另请注意, 的值count(y)可以为零(当所有 y 都为空时)。MySQL 会自动处理这种情况并NULL在分母为零的情况下生成。

在这种情况下,一些 DBMS 会抛出除以零错误,通常在这种情况下通过产生来处理null

select x,
    y,
    case when y > 0 then x / y end as x_per_y
from (
    select SUM(x) as x,
        COUNT(y) as y
    from my_tab
    group by groupable_col
    ) t
Run Code Online (Sandbox Code Playgroud)