【问题标题】:Oracle SQL to get store branch and product category with maximum sales for branch [duplicate]Oracle SQL获取商店分支和产品类别,分支销售额最大[重复]
【发布时间】:2026-01-18 16:30:02
【问题描述】:

我有一个具有多个分支的商店的架构。我正在尝试获取分支机构列表及其最畅销的产品类别。

ERD design for the tables

这是我从查询中得到的:

select branch_name,prod_category,sum(p.prod_price*il.inv_line_qty) as 
Category_Value
from w_branches b
 inner join w_products p on p.branch_id= b.branch_id
 inner join w_inv_line il on il.prod_id= p.prod_id
 inner join w_invoices i on i.inv_id=il.inv_id
group by p.branch_id, b.branch_name,p.prod_category;

这将返回一个分支名称列表,其中包含该分支拥有的每个产品类别以及该类别的总销售额。

BRANCH_NAME      PRODUCT CATEGORY        TOTAL SALES
---------------- ------------------------------------
BRANCHMALL       CPU                     41808
BRANCH_POS       Desktop                 62282
BRANCH_EAST      CPU                     51510
BRANCH_EAST      Networking              81600
BRANCH_POS       CPU                     22477
BRANCH_CENTRAL   Desktop                 126066
BRANCHMALL       SSD                     93154
BRANCH_NORTH     CPU                     217685

如您所见,分支正在重复。我只想获取分店销售额最高的类别,如下所示。

BRANCH_NAME      PRODUCT CATEGORY        TOTAL SALES
---------------- ------------------------------------
BRANCH_POS       Desktop                 62282
BRANCH_EAST      Networking              81600
BRANCH_CENTRAL   Desktop                 126066
BRANCHMALL       SSD                     93154
BRANCH_NORTH     CPU                     217685

谢谢!

【问题讨论】:

  • 请不要将解决方案添加到您的问题中。解决方案包含在答案中。由于您的问题是重复的,因此您无法回答,因此您可以改为回答重复的问题。

标签: sql oracle greatest-n-per-group


【解决方案1】:

为此,您可以在 oracle 中使用 rank() 来识别排名,然后选择具有一个排名的所有值。

select * from (
select branch_name, prod_category,category_value, rank() over (partition by branch_name order by category_value desc) as rank from
(select branch_name,prod_category,sum(p.prod_price*il.inv_line_qty) as 
Category_Value
from w_branches b
 inner join w_products p on p.branch_id= b.branch_id
 inner join w_inv_line il on il.prod_id= p.prod_id
 inner join w_invoices i on i.inv_id=il.inv_id
group by p.branch_id, b.branch_name,p.prod_category))
where rank = 1)

【讨论】:

  • 嘿,非常感谢您的回答!不幸的是,我在最后一行“ where rank=1”上遇到了一个我无法弄清楚的错误。 “命令行错误:10 列:7 错误报告 - SQL 错误:ORA-00904:“RANK”:无效标识符 00904。00000 -“%s:无效标识符””
  • 看来你应该重写最后两行。而不是 "p.prod_category) where rank = 1)" 尝试使用 "p.prod_category)) where rank = 1"(即括号应该在不同的地方关闭)。
  • 解决了。非常感谢 Pirate 和 Littlefoot(听起来你们两个可能是船员)!
  • 我忘记了那个括号,谢谢@Littlefoot。欢迎:)
  • 你就是海盗!