查询包含GROUP BY子句时ORACLE中的前10行

时间:2014-12-17 10:13:40

标签: sql oracle

如何从以下查询中选择前10行?

select dim_product.PRODUCT_NAME, sum(units_sold * (revenue - cost)) 
from FT_SALES 
INNER JOIN dim_product 
ON ft_sales.prod_dwh_id = dim_product.product_dwh_id
group by dim_product.PRODUCT_NAME
order by 2 desc;

---我尝试了使用ROWNUM的建议。

没有ROWNUM我得到以下结果

超软散装 - 2升48223,5
超软 - 1升38842,16
超柔软 - 500ml 32879,29
Detafast去污剂 - 100ml 29382
Detafast去污剂 - 800ml 27336
Detafast去污剂 - 200ml 24516
纯软洗涤剂 - 500ml 21147
纯软洗涤剂 - 250ml 20675,6
纯软洗涤剂 - 100ml - 额外19693,5
纯软洗涤剂 - 200ml 17563,74
超柔软 - 250ml 17430
超软 - 产品样本-2647,8

当添加ROWNUM时:

select dim_product.PRODUCT_NAME, sum(units_sold * (revenue - cost)) 
from FT_SALES 
INNER JOIN dim_product 
ON ft_sales.prod_dwh_id = dim_product.product_dwh_id
where ROWNUM<=10
group by dim_product.PRODUCT_NAME
order by 2 desc ;

我得到了结果:

Super Soft - 500ml 670,08
纯软洗涤剂 - 100ml - 额外597
纯软洗涤剂 - 200ml 338,3
Detafast去污剂 - 100ml 246
Detafast去污剂 - 200ml 213
超软 - 1升179,64

所以这不是我的解决方案。

4 个答案:

答案 0 :(得分:5)

在Oracle中使用rownum进行选择时,需要使用子查询:

select p.*
from (select dim_product.PRODUCT_NAME, sum(units_sold * (revenue - cost)) 
      from FT_SALES INNER JOIN
           dim_product 
           ON ft_sales.prod_dwh_id = dim_product.product_dwh_id
      group by dim_product.PRODUCT_NAME
      order by 2 desc
     ) p
where rownum <= 10

答案 1 :(得分:1)

您可以将ROWNUM&lt; = 10与查询一起使用。

答案 2 :(得分:1)

Rownum只返回指定的行,因为它们最初是由查询检索的。

在您的示例中,将rownum应用于查询时返回查询提取的前十行,然后对它们进行排序。请注意,您的10个返回结果确实按照它们的顺序排列,它们不是您想要的10个项目。

要按照您的意图获得前十名列表,您必须先执行查询,根据需要订购结果,然后应用rownum。这可以通过将初始查询转换为包含在应用rownum条件的外部查询中的子查询来实现。

一般来说,这看起来像是:

select [whichever fields you need]
from (
      [query which collects and then sorts desired data]    
)
where rownum [is less than, greater than, equal to, or whatever else you need it to be]

答案 3 :(得分:0)

将其包裹在另一个选择中并按rownum过滤。

SELECT * FROM (...) WHERE ROWNUM <= 10