2015-01-21 3 views
-1

Когда я запускаю следующий запрос, я получаюфункция группы не допускается здесь

ORA-00934: функциональная группа не имеет права здесь

чем проблема?

select c.Numcom,c.Nompr,c.salaire_fix 
from commercialv c,comercialv c1 
where c.salaire_fix=(max(c1.salaire_fix)); 
+1

Сначала я думаю, что вы пропустили соединение, во-вторых, вы должны получить max как подзапрос – Aramillo

ответ

8

Вы не можете использовать агрегатную функцию в предложении WHERE.

Учитывая ваш случай использования, вы, вероятно, хотите подзапрос:

select c.Numcom,c.Nompr,c.salaire_fix 
from commercialv c 
where c.salaire_fix=(select max(salaire_fix) from comercialv); 

Рациональным является то, что агрегатные функции работает на набор. С другой стороны, статья WHERE имеет только доступ к данным одной строки.

+0

Почему (где c.salarie_fix = max (c.salaire_fix)) не работает или (с csalarie_fix = max (c. salaire_fix)) работать ??? – user3093583

+0

'есть' работает над * группой *. 'where' - для фильтрации отдельных (« входных ») строк. –

3

Вы можете делать то, что вы хотите с аналитическими функциями:

select Numcom, Nompr, salair_fix 
from (select c.Numcom, c.Nompr, c.salaire_fix, 
      max(c.salaire_fix) over() as maxs 
     from commercialv c 
    ) c 
where c.salaire_fix = c.maxs; 

Что касается вашего запроса, функции агрегации не разрешены в пункте where.

+0

Слишком плохо 'c.salarie_fix = max (c.salaire_fix) over()' не работает –

+0

Этот вариант, как правило, работает лучше (он избегает второго зонда в таблице). –

0

Вы также мог бы сделать этот запрос, используя MAX() в качестве оконной функции (или аналитической функцию, если вы предпочитаете жаргон Oracle):

SELECT numcom, nompr, salaire_fix FROM (
    SELECT numcom, nompr, salaire_fix, MAX(salaire_fix) OVER () AS max_salaire_fix 
     FROM commercialv 
) WHERE salaire_fix = max_salaire_fix; 

Вы можете также использовать RANK():

SELECT numcom, nompr, salaire_fix FROM (
    SELECT numcom, nompr, salaire_fix, RANK() OVER (ORDER BY salaire_fix DESC) AS salaire_fix_rank 
     FROM commercialv 
) WHERE salaire_fix_rank = 1; 

Или даже ROWNUM:

SELECT * FROM (
    SELECT numcom, nompr, salaire_fix 
     FROM commercialv 
    ORDER BY salaire_fix DESC 
) WHERE rownum = 1; 

Единственное затруднение с последним состоит в том, что он получит только одну строку, даже если есть дополнительные строки с максимальным значением salaire_fix. Первые два запроса будут иметь более одной строки в этом случае.

+0

Почему (где c.salarie_fix = max (c.salaire_fix)) не работает или (с csalarie_fix = max (c.salaire_fix)) работает ??? – user3093583

+0

Первый не будет работать, потому что агрегатные функции (и функции окна) не работают в предложении 'WHERE'. Второй не будет работать, потому что вы не можете получить 'MAX (salaire_fix)' при группировке 'salaire_fix'. Действительно, лучший способ добиться желаемого результата - использовать аналитические (оконные) функции, как в моем ответе, так и @Gordon Linoff's. @Sylvain Leroux также будет работать и имеет то преимущество, что он полностью переносится (например, в MySQL, который не имеет оконных функций). –

Смежные вопросы