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 中使用 this 并不能保证 的值是什么order1.order_datetime
,MySQL 只是选择一个值,结果可能出乎意料。
您要么需要对列表GROUP BY
中的所有项目使用 a 或聚合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