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_name
和 b.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
我个人觉得这样更清楚地表达了你想要做的事情。
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_nameSELECT 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_name
和 b.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
我个人觉得这样更清楚地表达了你想要做的事情。