Oracle SQL中如何选择五款畅销产品?

Posted

技术标签:

【中文标题】Oracle SQL中如何选择五款畅销产品?【英文标题】:How to select five selling product in Oracle SQL? 【发布时间】:2020-11-19 03:09:36 【问题描述】:

EX: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 关键字” *原因: *行动:

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

【问题讨论】:

Oracle 不支持select top 改用rownum 【参考方案1】:

我们可以在这里使用ROWNUM

SELECT Product_Name, Order_Total
FROM
(
    SELECT p.*
    FROM Product_Summary p
    ORDER BY Order_Total DESC
) t
WHERE ROWNUM <= 5;

【讨论】:

【参考方案2】:

您可以按如下方式使用fetch first 5 rows with tie

SELECT p.*
 FROM Product_Summary p
ORDER BY Order_Total DESC NULLS LAST
fetch first 5 rows with tie;

【讨论】:

【参考方案3】:

您没有提及您使用的 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;

【讨论】:

以上是关于Oracle SQL中如何选择五款畅销产品?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 Laravel 中对库存单位进行分组来找到畅销书?

如何在 Magento 的产品列表页面上按最受欢迎(最畅销)的产品排序?

如何将oracle数据库中的数据如何导入到sqlserver

oracle11g客户端如何完全卸载

ORACLE PL/SQL:函数和可选参数,如何?

如何完全卸载Oracle 11g数据库