Jos*_*h.F 4 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;
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
一种方法是使用子查询:
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)