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 的产品列表页面上按最受欢迎(最畅销)的产品排序?