2011-12-03 14 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

感謝@グレッグ。それは私に必要なものを私に与えます。 – 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

OK、編集しました。 – bonsvr

0

全く本当にこのケースでは、分析機能のために必要がありません。最良の選択肢は、dense_rankオプションを使用してsum()に2回、max()に2回グループ化することです。

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);