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】:您可以使用cte
s 来执行此操作。
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嵌套聚合分组错误的主要内容,如果未能解决你的问题,请参考以下文章