2011-12-03 6 views
3

Oracle에서 pub_id, sales, price를 나열하는 titles 테이블에서 pub_id와 최대 총 수익을 모두 반환하는 쿼리를 작성하려고합니다. 나는를 얻을 수있는 방법 SUM()에서 Max() 사용

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

모든 아이디어와 나는

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

각 pub_id를위한 pub_id를 총 매출 목록 중 하나를 얻을 수 있습니다 아니면 그냥 MAX (판매 * 가격)를 얻을 수 있습니다 pub_id가 총 수익의 최대 값을 초과합니까?

답변

2

는 각 pub_id에 대한 최대의 수익을 줄 것이다 아래 강력한 ORACLE ANALYTICAL FUNCTIONS

으로 간단이

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

감사 @Greg. 그것은 제가 필요한 것을 제공합니다. – user1078958

+0

문제 없음 -이 대답을 수락 해 주시기 바랍니다 :-) –

1

같은 순위 기능을 사용할 수 있습니다.

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

. 가장 좋은 옵션은 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);