2015-11-02 104 views
0

我试图找到销售最大单位的产品的名称,我有两个表,购买和产品,产品具有pname和pid,购买有pid,qty(销售的单位)。 我管理这个SQL嵌套聚合分组错误

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

我得到分组错误。

+1

什么查询会导致错误?即,如何使用max(sum(q.qty))? –

+1

如果您可以提供一些样本输入和期望的输出数据,以及您如何在导致错误的查询中尝试使用'max(sum(q.qty))',这将有所帮助。注:如果您使用的是ansi连接语法(例如,'from x inner join y on(x.col = y.col)'),那么您不需要在where子句中重复连接条件。因此,您可以从查询中删除“where p.pid = q.pid”。 – Boneist

+0

[如何结合MySQL中的聚合函数?]可能的重复(http://stackoverflow.com/questions/3409581/how-to-combine-aggregate-functions-in-mysql) – xQbert

回答

0

您可以使用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 
0

一种方法是先导出值使用一个共同的表格表达。

简单地说,你不能在其他聚合包装聚合。但是,您可能能够围绕分析打包汇总。

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 
0

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

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