Oracle SQL using group by: 能否按用于连接两个表的字段进行分组?

Oracle SQL using group by: Can you group by a field used to join two tables?

SELECT b.first_name, b.last_name, SUM(t.price_total)
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id
GROUP BY
b.broker_id

我的问题是“显示每个经纪人交易的总价值”。答案按 b.first_name||' '||b.last_name 分组,但我认为应该通过经纪人的 ID 进行分组(即,可以将两个同名的人分组在一起,这不会通过经纪人 ID 发生)。

然而 运行 我的代码出现错误

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 1 Column: 8

我的问题是,为什么我不能使用 b.broker_id 作为唯一的分组依据列?

尝试将 GROUP BY 子句更改为: ... 按 b.first_name、b.last_name

分组

只需在 GROUP BY

中添加 last_name 和 first_name
SELECT b.first_name, b.last_name, SUM(t.price_total)
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id
GROUP BY
b.broker_id,b.first_name, b.last_name

如果两个人的姓氏和名字相同,结果中的行会不同,因为 GROUP BYbroker_id

试试这个:

SELECT b.broker_id, b.first_name, b.last_name, SUM(t.price_total)
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id
GROUP BY
b.broker_id, b.first_name, b.last_name

当您使用 GROUP BY 时,select 子句只能包含在 GROUP BY 中指定的列和该组的 aggregated/calculated 字段,如总和、平均值、最小值、最大值等。

你可以使用解析函数来克服它,这主要用于避免自连接并在进行聚合时获取你需要的所有字段:

SELECT distinct * from (SELECT b.first_name, b.last_name, 
SUM(t.price_total) over (partition by b.broker_id) price_total
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id);

这是因为您在 select 子句中包含了 b.first_nameb.last_name,而没有将它们聚合或分组。

您可以将这两个项目添加到 group by 子句中,或者在 select 子句中对每个项目使用聚合函数(例如 max),以使您的查询有效。

一种略有不同的方法是按经纪人 ID 对交易进行分组,然后将其结果加入经纪人 table:

SELECT b.first_name, b.last_name, price_sum
FROM brokers b
LEFT OUTER JOIN (
  SELECT broker_id,  SUM(price_total) AS price_sum
  FROM trades
  GROUP BY broker_id
) t
ON b.broker_id=t.broker_id

我个人觉得这样更清楚地表达了你想要做的事情。