如何对MySQL中的聚合列应用算术运算? TL;博士

如何对MySQL中的聚合列应用算术运算? TL;博士,mysql,sql,group-by,aggregate,Mysql,Sql,Group By,Aggregate,有没有办法在算术运算中使用聚合结果 细节 我想取两个聚合列(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; 这不起作用,但我发现它起作用了: SELECT SUM(x) AS x,

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

细节 我想取两个聚合列(
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;
这不起作用,但我发现它起作用了:

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;
但是如果我需要很多列操作聚合,它很快就会变得非常重复,我不知道如何判断MySQL是否可以优化,这样我就不会多次计算聚合

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

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

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


一种方法是使用子查询:

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
还要注意,
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

您可以使用触发器存储计算值,但在这种情况下,您可能比多次写入聚合的开销要大。AFAIK、mysql将再次运行相同的操作,因此这些值被回收(每个查询)考虑
null
cases for
y
,但是mysql将自行处理。因此,您的
CASE
子句是多余的,您也可以在这里看到: