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作为分组的唯一列?
答案 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_name
和b.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);