2013-04-17 28 views
0
SELECT team, sum(maths) 
FROM marks 
GROUP BY team 
HAVING sum(maths) = (
    SELECT max(sum(maths)) 
    FROM marks 
    GROUP BY team 
) 

有三個小組A,B,C和一些沒有成員在其中。更換HAVING與其中

首先使用SELECT max(sum(maths)) FROM marks GROUP BY team我正在獲得數學的最大總和。

現在使用整個查詢,我試圖展示數學得分最高的團隊。

如何重寫查詢以便用WHERE替換HAVING

+0

你正在使用什麼[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,並且適用於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等等...... –

+1

使用oracle ..和sqlplus – debal

+0

爲什麼你會問這個問題?您的查詢是正確和清晰的。 –

回答

1

請嘗試:

select * from (
    select team, v maxmarks, row_number() over (order by v desc) RNum from(
    SELECT team, sum(maths) v 
    FROM marks 
    group by team 
)x 
)xx where RNum=1; 
+0

這顯示最大分數 – debal

+0

是的......這就是你想要的嗎? – TechDo

+1

@techdo - OP希望擁有最高分的球隊,而不僅僅是分數值。 –

0

可以用WHERE替換HAVING,但這樣做沒有好處。

select team, sum(maths) from 
(
    SELECT team, sum(maths) as total 
    FROM marks 
    GROUP BY team 
) t1 
where t1.total = (select max(t1.total) from t1) 
0

如果你爲了你的結果,你可以在外部SELECT它限制第一行包裝他們,使用ROWNUM pseudocolumn

SELECT * 
FROM (
    SELECT team, sum(maths) 
    FROM marks 
    GROUP BY team 
    ORDER BY sum(maths) DESC 
) 
WHERE ROWNUM = 1; 

或者您可以使用ROW_NUMBER analytic function,再次包裹在外層選擇中:

SELECT * 
FROM (
    SELECT team, sum(maths), 
     ROW_NUMBER() OVER (PARTITION BY team ORDER BY sum(maths) DESC) AS rn 
    FROM marks 
    GROUP BY team 
) 
WHERE rn = 1; 
0

這不是比其他人更有效率,但如果你只是想多種方式,你可以試試這個。

SELECT DISTINCT FIRST_VALUE(TEAM) OVER(ORDER BY SUM(MATHS) DESC), 
      FIRST_VALUE(SUM(MATHS)) OVER(ORDER BY SUM(MATHS) DESC) 
FROM MARKS 
GROUP BY TEAM 
0

的另一種方法,使用一個公共表表達式:

with team_sum as (
    select team, 
      sum(maths) sum_maths 
    from  marks 
    group by team) 
select * 
from team_sum 
where sum_maths = (
     select max(sum_maths) 
     from team_sum) 

對於非常大的數字團隊會表現良好,因爲優化器可以具體化結果集中的team_sum公用表表達式,並執行max()就可以了。

它還列出了他們共享相同總分的多個團隊。