如何将值与SQL max(count)函数匹配?

时间:2016-03-19 04:57:05

标签: sql oracle

我有一个orderLine表,如下所示

enter image description here

我想知道哪个披萨是最畅销的,以及披萨的数量。

我尝试过查询:

select sum(quantity), pizza_name  from order_line group by pizza_name;

它返回

enter image description here

这几乎是我想要的,但是当我开始添加Max功能时,它无法将披萨名称与销售的披萨总数相匹配

例如:

select MAX(sum(quantity)), pizza_name  from order_line group by pizza_name;

它返回以下错误:

  

“不是单组小组功能”

我想我可以通过使用子查询来实现这一点,但我不知道如何做到这一点。

3 个答案:

答案 0 :(得分:1)

您不需要max。如果您只想要一个披萨,那么您可以使用order byfetch first 1 row only(或类似limittop之类的东西):

select sum(quantity), pizza_name
from order_line
group by pizza_name
order by sum(quantity)
fetch first 1 row only;

或者,如果你想要所有这些比萨饼,请使用rank()

select p.*
from (select sum(quantity) as quantity, pizza_name,
             rank() over (order by sum(quantity) desc) as seqnum
      from order_line
      group by pizza_name
     ) p
where seqnum = 1;

答案 1 :(得分:0)

两个查询都给出了相同的预期结果

SELECT PIZZA_NAME,
  SUM(QUANTITY) "Total Quant"
FROM Order_line
GROUP BY PIZZA_NAME
ORDER BY "Total Quant" DESC
FETCH FIRST 1 row only;

SELECT PIZZA_NAME, "Total Quantity" FROM (
SELECT PIZZA_NAME,SUM(QUANTITY) "Total Quantity", RANK() OVER (ORDER BY SUM(QUANTITY) DESC) T FROM Order_line GROUP BY PIZZA_NAME
) query1 where query1.T=1 ;

答案 2 :(得分:0)

您按pizza_name分组以获得每个pizza_name的总和(数量)。

然后,您在数量总和上使用MAX汇总 ,但您没有指定结果中三个披萨名称中的哪一个。您还需要在pizza_name上使用聚合函数,这是您不具备的。因此错误。

如果您想使用您的查询,您必须在pizza_name上应用适当的聚合函数,即最后/最后一次KEEP DENSE_RANK。

CAR|CLASS|CLASS FINISH POSITION|CHAMP CLASS POSITION
1  |5    |1                    |2
2  |1    |1                    |1
3  |2    |2                    |1
4  |     |                     |
5  |3    |3                    |1
6  |5    |2                    |3
7  |     |                     |
8  |2    |5                    |2
9  |5    |                     |
10 |5    |8                    |4

但一方面戈登的查询在我看来更具可读性。而另一方面,这种双重聚合是Oracle特定的,而不是SQL标准。没有经验的读者可能会感到困惑,即尽管有GROUP BY子句,查询仍会生成一个结果行。

相关问题