【问题标题】:Using Max() on SUM() Aggregate function in Oracle在 Oracle 中的 SUM() 聚合函数上使用 Max()
【发布时间】:2011-12-03 12:46:20
【问题描述】:

我正在尝试在 Oracle 中编写一个查询,它将返回 pub_id 和标题表中列出的 pub_id、销售额、价格的最大总收入。 我可以得到一个带有 pub_id 的列表和每个 pub_id 的总收入

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

或者我可以只得到 MAX(Sales*Price)

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

有什么想法可以让 pub_id 获得最大的总收入吗?

【问题讨论】:

    标签: sql oracle oracle10g sum max


    【解决方案1】:

    你可以像这样使用排名函数

    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;    
    

    【讨论】:

    • 谢谢@Greg。它给了我我需要的东西。
    【解决方案2】:

    强大的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
    

    【讨论】:

    • 感谢@bonsvr 但是不断收到此错误“ORA-00923:FROM 关键字未在预期位置找到”
    【解决方案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
        )
    

    【讨论】:

    • 谢谢@Alessandro。还不熟悉dense_rank,但很快就会。
    【解决方案4】:
    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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2023-03-12
      相关资源
      最近更新 更多