2011-12-03 123 views
3

我正在尝试在Oracle中编写一个查询,它将从列出pub_id,sales,price的titles表中返回pub_id和最大总收入。 我可以在SUM中使用Max()聚合函数在Oracle中

SELECT MAX(SUM(sales*price)) FROM titles GROUP BY pub_id; 

任何想法得到要么的pub_id和总收入为每个的pub_id的列表与

SELECT PUB_ID, SUM(SALES*PRICE) as TotalRevenue FROM TITLES GROUP BY PUB_ID; 

或者,我可以得到公正的MAX(销售*价格),我怎么能得到pub_id与总收入的最大值?

回答

2

可以使用RANK函数类似这样的

select * from 
(
select a.*,rank() over (order by sum_sales desc) r from 
(
select pub_id,sum(sales*price) sum_sales from titles group by pub_id 
) a 
) 
where r = 1;  
+0

感谢@格雷格。它给了我我需要的东西。 – user1078958

+0

没问题 - 随时接受这个答案:-) –

1

这就是简单与强大的ORACLE ANALYTICAL FUNCTIONS

下面将给出最大的收入为每个pub_id

select pub_id,REV from 
    (
    select pub_id, (sales*price) as REV, 
    max(sales*price) over (partition by pub_id order by 1) as MAX 
    from titles 
    ) 
    where REV=MAX 

如果你想确定pub_id有最大的收益:

select * from 
    (
    select pub_id,REV from 
    (
    select pub_id, (sales*price) as REV, 
    max(sales*price) over (partition by pub_id order by 1) as MAX 
    from titles 
    ) 
    where REV=MAX order by MAX desc 
    ) 
    where rownum<2 
+0

感谢@bonsvr但是不断收到此错误“ORA-00923:FROM关键字找不到预期的地方” – user1078958

+0

好吧,我编辑它。 – bonsvr

0

有没有真的需要解析函数在这种情况下。最好的选择是将012(3)和dense_rank选项中的sum()和max()的以下时间分组两次。

select max(pub_id) keep (dense_rank last order by TotalRevenue) 
from (
     SELECT PUB_ID, SUM(SALES*PRICE) as TotalRevenue 
     FROM TITLES 
     GROUP BY PUB_ID 
    ) 
+0

谢谢@Alessandro。还不熟悉dense_rank,但即将推出。 – user1078958

0
SELECT PUB_ID, SUM(SALES*PRICE) as TotalRevenue 
FROM TITLES 
GROUP BY PUB_ID 
HAVING SUM(SALES*PRICE) = (SELECT MAX(SUM(SALES*PRICE)) 
          FROM TITLES 
          GROUP BY PUB_ID);