2016-11-27 9 views
0

Ниже запрос возвращает список наиболее популярных театральных и ROWTYPE комбинаций отсортированных по общей сумме: так, например:ORACLE - MAX и SUM

NAME  ROWTYPE TOTALAMOUNT 
theatre1 middle 200 
theatre2 front 190 
theatre1 front 150 
theatre2 middle 100 

Принимая во внимание то, что мне нужно, это просто максимум в театре:

theatre1 middle 200 
theatre2 front 190 

запрос:

SELECT name, rowtype, sum 
from (select 
name, rowtype, sum(totalamount) sum from trow, fact, theatre 

Where trow.trowid = fact.trowid 
AND 
theatre.theatreid = fact.theatreid 

GROUP BY rowtype, name 
) 

ORDER BY sum DESC, name, rowtype ; 
+0

Пожалуйста, поделитесь определением точки трения, факта и театра и целью использования суммы (totalamount) –

+0

Было бы полезно, если бы мы знали, с каких таблиц появились поля NAME и ROWTYPE. Я УГАДАЮ, что NAME - это название театра, и, следовательно, происходит от THEATER, а тип строки - от TROW, но оставляет открытым вопрос о том, откуда приходит TOTALAMOUNT. Некоторое уточнение в вопросе было бы полезно. Благодарю. –

ответ

0

Вы можете использовать оконные функции для этого:

select name, rowtype, sum 
from (select name, rowtype, sum(totalamount) as sumta, 
      max(sum(totalamount)) over (partition by name) as maxsumta 
     from trow join 
      fact 
      on trow.trowid = fact.trowid join 
      theatre 
      on theatre.theatreid = fact.theatreid 
    group byrowtype, name 
    ) nr 
where sumta = maxsumta; 

Кроме того, вы должны научиться использовать правильный, явный JOIN синтаксис. Простое правило: Никогда запятые запятые в разделе FROM. Всегда использовать надлежащий явный JOIN синтаксис.

+0

Привет, большое спасибо, это прекрасно работает –

0

Поместите свой текущий запрос в общее табличное выражение, а затем использовать функции окна, чтобы найти максимальную общую сумму для каждого театра.

WITH cte AS 
(
    SELECT name, rowtype, SUM(totalamount) sum 
    FROM trow 
    INNER JOIN fact 
     ON trow.trowid = fact.trowid 
    INNER JOIN theatre 
     ON theatre.theatreid = fact.theatreid 
    GROUP BY name, rowtype 
) 

SELECT name, rowtype, sum 
FROM 
(
    SELECT name, 
      rowtype, 
      sum, 
      MAX(sum) OVER (PARTITION BY name) maxSum 
    FROM cte 
) t 
WHERE t.sum = t.maxSum 
+0

Привет, спасибо за ваш комментарий - оракул возвращает ошибку ниже ORA-00979: не выражение GROUP BY –

+0

@HannahFarrugia Не могли бы вы повторить запрос? –