首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将算术操作应用于MySQL中的聚合列?

问如何将算术操作应用于MySQL中的聚合列?
EN

Stack Overflow用户
提问于 2017-03-27 20:27:36
回答 1查看 1.8K关注 0票数 5

TL;DR

在算术运算中有使用聚合结果的方法吗?

详细信息

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

代码语言:javascript
复制
-- 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;

这不起作用,但我发现这是真的:

代码语言:javascript
复制
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是否可以进行优化,从而避免多次计算聚合。

我已经搜索了很长一段时间,并询问了一些专业人士,我能想到的最好的选择是嵌套选择,而我的db不支持嵌套选择。

编辑:它确实支持它们,我做错了什么,过早地排除了嵌套的选择。

而且,MySQL文档似乎支持它,但我无法让类似的东西工作(例如在链接的底部)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-27 20:32:41

一种方法是使用子查询:

代码语言:javascript
复制
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。

在这种情况下,某些DBMSes抛出除以零错误,在这种情况下通常通过生成null来处理:

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43055851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档