繁体   English   中英

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

[英]how to match a value with SQL max(count) function?

我有一个 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;

它返回以下错误:

“不是单组组功能”

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

你不需要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;

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

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 ;

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

然后您通过对数量总和使用 MAX再次聚合,但您没有指定结果中包含三个比萨名称中的哪一个。 您还需要一个关于pizza_name 的聚合函数,而您没有。 因此错误。

如果您想使用您的查询,您必须对pizza_name 应用适当的聚合函数,即KEEP DENSE_RANK FIRST/LAST。

select 
  max(sum(quantity)), 
  max(pizza_name) keep (dense_rank last order by sum(quantity))
from order_line
group by pizza_name;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM