使用group by的Oracle SQL:您可以按用于连接两个表的字段进行分组吗?

时间:2016-01-07 14:12:31

标签: sql oracle group-by outer-join

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作为分组的唯一列?

5 个答案:

答案 0 :(得分:1)

只需在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 BY中的broker_id,结果将是不同的行

答案 1 :(得分:1)

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

您可以将这两个项目添加到group by子句中,也可以在select子句中对每个项目使用聚合函数(例如max),以使查询正常工作。

答案 2 :(得分:1)

稍微不同的方法是按经纪人ID对交易进行分组,然后将结果加入经纪人表:

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

试试这个:

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中指定的列和该组的聚合/计算字段,如sum,average,min,max等。

您可以使用分析函数来克服它,这主要用于避免自联接并获取聚合时所需的所有字段:

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);