gpt4 book ai didi

mysql - Oracle 与 MySQL - 聚合函数

转载 作者:搜寻专家 更新时间:2023-10-30 21:38:48 24 4
gpt4 key购买 nike

谁能解释 Oracle 的局限性,即为什么以下语句在 MySQL 中有效,但在 Oracle 中收到“不是 GROUP BY 表达式”?

  SELECT order1.user_id, 
order1.order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id

是因为Oracle不知道如何处理order_datetime列吗?它不能像在 MySQL 中那样只返回从 GROUP BY order1.user_id 行接收到的任何行的列结果吗?

编辑:

我知道所有列都应该在分组依据中,但是我试图理解为什么 Oracle 不返回与 MySQL 相似的结果(而 MySQL 不需要每个 GROUP BY,而 Oracle 需要)。

最佳答案

Oracle 实际上正在执行正确的行为。当您使用 GROUP BY 时,选择列表中的项目必须出现在 GROUP BY 或聚合函数中。

SELECT order1.user_id, 
order1.order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id, order1.order_datetime

MySQL 使用 EXTENSION TO GROUP BY这允许不执行 FULL GROUP BY 的行为.在 MySQL 中使用它并不能保证 order1.order_datetime 的值是什么,MySQL 只是选择一个值,结果可能出乎意料。

您要么需要使用 GROUP BY 或聚合 SELECT 列表中的所有项目(与上面类似),要么您必须重写查询。您可以使用以下任何一项:

SELECT order1.user_id, 
min(order1.order_datetime) order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id

它对 order_datetime 应用聚合,那么您不必按日期分组。

您可以使用 sum() over():

SELECT order1.user_id, 
order1.order_datetime,
SUM(order2.order_total) over(partition by order1.user_id) order_total
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id

或者这可以使用子查询重写。

SELECT order1.user_id, 
order1.order_datetime,
order2.order_total
FROM order_table order1
JOIN
(
select SUM(order_total) order_total, user_id
from order_table
group by user_id
) order2
ON order1.user_id = order2.user_id

关于mysql - Oracle 与 MySQL - 聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com