首页 > 解决方案 > 如何在 Oracle SQL 中选择五个畅销产品?

问题描述

例如: 5. 编写一个 SELECT 语句,使用您在练习 4 中创建的视图来获取五种最畅销产品的总销售额。

SELECT TOP 5 Product_Name, Order_Total
FROM Product_Summary 
ORDER BY Order_Total DESC

我收到此错误:

命令行错误:2 列:12
错误报告 -
SQL 错误:ORA-00923:在预期
的位置找不到 FROM 关键字 00923。00000 -“在预期的位置找不到 FROM 关键字”
*原因:
*操作:

请我一直在尝试解决这个问题,但我不知道如何解决它。

标签: sqloracle

解决方案


您没有提到您使用的 Oracle 数据库版本;最终的“答案”取决于它,因为并非所有版本都支持我们答案中提供的所有功能。

这是适用于 Oracle 11g 及更高版本的一个。

我没有你的桌子,但是 - 同样,在 Scott 的桌子上EMP。查看 3 个分析函数(以及ROWNUM伪列)返回什么:

SQL> select ename, sal,
  2    rownum row_num,
  3    rnk_1,
  4    rnk_2,
  5    rnk_3
  6  from (select ename,
  7          sal,
  8          row_number() over (order by sal desc) rnk_1,
  9          rank() over (order by sal desc) rnk_2,
 10          dense_rank() over (order by sal desc) rnk_3
 11        from emp
 12        order by sal desc
 13       )
 14  order by sal desc;

ENAME             SAL    ROW_NUM      RNK_1      RNK_2      RNK_3
---------- ---------- ---------- ---------- ---------- ----------
KING            10000          1          1          1          1
FORD             3000          2          2          2          2
SCOTT            3000          3          3          2          2
JONES            2975          4          4          4          3
BLAKE            2850          5          5          5          4
CLARK            2450          6          6          6          5
ALLEN            1600          7          7          7          6
TURNER           1500          8          8          8          7
MILLER           1300          9          9          9          8
WARD             1250         10         10         10          9
MARTIN           1250         11         11         10          9
ADAMS            1100         12         12         12         10
JAMES             950         13         13         13         11
SMITH             920         14         14         14         12

14 rows selected.

SQL>

注意RNK_3哪个需要注意关系(两个或多个员工具有相同的薪水)。一旦确定哪个版本最适合您的需求,请执行以下操作:

SQL> select ename,
  2         sal,
  3         rnk_3
  4  from (select ename,
  5          sal,
  6          dense_rank() over (order by sal desc) rnk_3
  7        from emp
  8       )
  9  where rnk_3 <= 5
 10  order by rnk_3;

ENAME             SAL      RNK_3
---------- ---------- ----------
KING            10000          1
SCOTT            3000          2
FORD             3000          2
JONES            2975          3
BLAKE            2850          4
CLARK            2450          5

6 rows selected.

SQL>

在你的情况下,那将是

select product_name,
       order_total,
       rnk
from (select product_name,
             order_total,
             dense_rank() over (order by order_total desc) rnk
      from product_summary
     )
where rnk <= 5
order by order_total desc;

推荐阅读