求教SQL语句group by两个不同表的字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教SQL语句group by两个不同表的字段相关的知识,希望对你有一定的参考价值。

select sa.CUSTOMER,rp.CATEGORY from PMS_SP_PRODUCT rp inner join PMS_SP_APPLY sa on rp.taskid=sa.taskid group by sa.CUSTOMER,rp.CATEGORY

求大神把这条语句改成子查询,去掉inner join

select distinct sa.CUSTOMER,rp.CATEGORY from
PMS_SP_PRODUCT rp , PMS_SP_APPLY sa
where rp.taskid=sa.taskid
--或者
select sa.CUSTOMER,rp.CATEGORY from
PMS_SP_PRODUCT rp , PMS_SP_APPLY sa
where rp.taskid=sa.taskid group by sa.CUSTOMER,rp.CATEGORY
--或者
select distinct a.CUSTOMER,b.CATEGORY from
(select sa.CUSTOMER,sa.taskid from PMS_SP_APPLY sa where exists
(select * from PMS_SP_PRODUCT rp where rp.taskid=sa.taskid)) a,
(select rp.CATEGORY,rp.taskid from PMS_SP_PRODUCT rp where exists
(select * from PMS_SP_APPLY sa where rp.taskid=sa.taskid)) b
where a.taskid=b.taskid
参考技术A 子查询也要两个表的字段同时分组?

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

【中文标题】Oracle SQL using group by:你能按用于连接两个表的字段进行分组吗?【英文标题】:Oracle SQL using group by: Can you group by a field used to join two tables? 【发布时间】:2016-04-11 23:16:32 【问题描述】:
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 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合函数的参数。 【参考方案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

我个人觉得这更清楚地表达了你想要做什么。

【讨论】:

【参考方案2】:

试试这个:

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

【讨论】:

虽然这确实有效(谢谢),但为什么我不能只使用代理 ID 列?我的理解是您可以按任何非聚合的列进行分组,也可以按不在 SELECT 中的列进行分组。经纪人 ID 满足这两个要求【参考方案3】:

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

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

【讨论】:

【参考方案4】:

只需在 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,结果中的行会不同

【讨论】:

谢谢,但是和上面的用户有同样的问题,为什么我不能只使用 broker id 列?我的理解是您可以按任何非聚合的列进行分组,也可以按不在 SELECT 中的列进行分组。经纪人 ID 满足这两个要求 @shen SELECT 语句中的所有列,不在聚合函数中,必须在 GROUP BY 中。问题不是 broker_id 列,而是 last_name 和 first_name【参考方案5】:

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

【讨论】:

以上是关于求教SQL语句group by两个不同表的字段的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中的group by啥意思

SQL数据库中查询语句Order By和Group By有啥区别

sql语句中的group by啥意思

group by 两个字段

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?