2013-04-17 1 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 с некоторыми членами в ней.Замена HEREING WHERE

Сначала с использованием SELECT max(sum(maths)) FROM marks GROUP BY team Я получаю максимальную сумму математики.

Теперь, используя весь запрос, я пытаюсь отобразить команду, которая получила наибольшую сумму по математике.

Как я могу переписать запрос, чтобы заменить HAVING на WHERE.

+0

Какие [РСУБД] (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

Возможно заменить HAVING WHERE, но при этом нет никакой пользы.

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() на нем.

В нем также перечислены команды, в которых они имеют одинаковый общий балл.