2017-03-27 35 views
1

TL; DR

有没有办法在算术运算中使用聚合结果?如何将算术运算应用于MySQL中的聚合列?

详细

我要带两个聚合列(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可以进行优化,以便我不计算多次聚合。

我搜索SO,有一段时间了,也问了一些专业人士,最好的替代,我可以拿出嵌套选择,其中~~我的数据库不支持。~~

编辑:支持他们,我已经做错了什么,而排除了嵌套选择过早

此外,MySQL的文件似乎支持它,但我不能让这样的事情工作(例如在链接的最底部)

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

+0

你可以使用一个触发器来存储计算的值,但在这种情况下,你可能会得到比编写多次聚合更多的开销.AFAIK,mysql再次运行相同的操作,以便值被回收(每个查询) – Mihai

回答

3

一种方法是使用子查询:

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 
+0

好好考虑'y'的'null'情况,但MySql会自行处理。因此,您的'CASE'子句是多余的,您也可以在这里看到:http://rextester.com/GJKGP35737: – cars10m