SQL嵌套聚合分组错误

Posted

技术标签:

【中文标题】SQL嵌套聚合分组错误【英文标题】:SQL nested aggregate grouping error 【发布时间】:2015-11-02 17:02:08 【问题描述】:

我正在尝试查找已售出最大单位的产品名称,我有两个表,购买和产品,产品有 pname 和 pid,购买有 pid,数量(售出单位)。 我已经做到了

select p.pname, sum(q.qty) from purchases q
inner join products p on p.pid=q.pid
where p.pid=q.pid
group by p.pname
order by sum(q.qty) desc

我按降序获得结果,但我只需要最畅销的单位,多个产品可以有最畅销的单位。当我使用

max(sum(q.qty)) 

我收到分组错误。

【问题讨论】:

什么查询会导致错误?即,你如何使用 max(sum(q.qty))? 如果您可以提供一些示例输入和预期输出数据,以及您尝试在查询中使用max(sum(q.qty)) 导致错误的方式,这将有所帮助。注:如果您使用的是 ansi 连接语法(例如from x inner join y on (x.col = y.col)),那么您不需要在 where 子句中重复连接条件。因此,您可以从查询中删除 where p.pid = q.pid How to combine aggregate functions in mysql?的可能重复 【参考方案1】:

一种方法是首先使用公用表表达式导出值。

简单地说,您不能将聚合包装在其他聚合中。但是,您可以将聚合包裹在分析周围。

with cte as (select p.pname, sum(q.qty) from purchases q
inner join products p on p.pid=q.pid
where p.pid=q.pid
group by p.pname
order by sum(q.qty) desc)
Select pname, max(purchases)
from cte
group by pname

【讨论】:

【参考方案2】:

您可以使用ctes 来执行此操作。

1)首先得到每个产品的总数量 2)然后得到所有这些总数的最大值 3)将它与您的原始查询一起加入

with totals as (select pid, sum(qty)  totalqty from purchases group by pid)
, t1 as (select p.pid, p.pname, sum(q.qty) totqty
         from purchases q
         inner join products p on p.pid=q.pid
        group by p.pname) 
, t2 as (select max(totalqty) maxtotal from totals)
select pname, totqty
from t1 
join t2 on t1.totqty = t2.maxtotal

【讨论】:

【参考方案3】:

分析可以为您简化这一过程。如果您有多个产品具有相同的总和(数量)并且恰好是最大值(总和(数量)),那么这应该会为您提供:

select pname, quantity
FROM (
select p.pname
     , sum(q.qty) quantity
     ,rank() over (order by sum(q.qty desc) ranking
from purchases q
 inner join products p on p.pid=q.pid
group by p.pname
)
where ranking = 1

【讨论】:

以上是关于SQL嵌套聚合分组错误的主要内容,如果未能解决你的问题,请参考以下文章

即使字段包含在分组依据列表中,分组依据或聚合错误

查询分组中的 Oracle SQL 条件聚合函数

使用预先聚合的值加入两个表,既不会导致分组错误,也不会导致聚合错误

使用转换的熊猫分组列表聚合失败并出现键错误

错误 [HY000] 错误:聚合函数调用不能嵌套 */

使用 coalesce() 避免嵌套聚合错误