【问题标题】:How to select five selling product in Oracle SQL?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

标签: sql oracle


【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 2017-07-21
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        相关资源
        最近更新 更多