有没有办法在算术运算中使用聚合结果?
我想采用两个聚合列(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是否可以进行优化以便我不会多次计算聚合。
我已经搜索了一段时间了,并且问了一些专业人士,我能想到的最好的选择是嵌套选择,~~我的db不支持.~~
编辑: 支持他们,我做错了什么,并且过早地排除了嵌套选择
此外,MySQL文档似乎支持它,但我无法使用这样的东西(例如在链接的最底部)
https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html
答案 0 :(得分: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都为null时)。
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