我有一个orderLine表,如下所示
我想知道哪个披萨是最畅销的,以及披萨的数量。
我尝试过查询:
select sum(quantity), pizza_name from order_line group by pizza_name;
它返回
这几乎是我想要的,但是当我开始添加Max功能时,它无法将披萨名称与销售的披萨总数相匹配
例如:
select MAX(sum(quantity)), pizza_name from order_line group by pizza_name;
它返回以下错误:
“不是单组小组功能”
我想我可以通过使用子查询来实现这一点,但我不知道如何做到这一点。
答案 0 :(得分:1)
您不需要max
。如果您只想要一个披萨,那么您可以使用order by
和fetch first 1 row only
(或类似limit
或top
之类的东西):
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子句,查询仍会生成一个结果行。