2016-09-14 1 views
0

У меня есть схема emp таблицы как (empno , ename , hiredate ,sal,job) и у меня есть запрос, как:Почему я получаю синтаксическую ошибку не группы по выражению в нижнем запросе?

Найти общий годовой оклад распределить работу мудрой в году 81.

я написал ниже запрос:

select job, sum(Sal*12) 
from emp 
group by job 
having (extract(year from hiredate)) = '1981' ; 

Этот запрос дает результат как «не группа по выражению», пожалуйста, помогите мне в определении проблемы здесь.

+0

Какой тип dbms вы используете? – Jens

+0

Я работаю над Oracle10g – stackuser

+0

Затем добавьте теги в следующий раз – Jens

ответ

4

HAVING предназначен для использования с агрегатом. (extract(year from hiredate))='1981' следует поместить в пункт WHERE.

select job,sum(Sal*12) 
from emp 
where extract(year from hiredate)=1981 
group by job 

Наличие применяется после агрегирования и должно использоваться, если вы хотите отфильтровать результаты агрегации. Такого требования нет. Согласно вашему вопросу, вы пытаетесь захватить только записи с 1981 года. Нет никакого смысла в совокупности перед сравнением.

+0

Но я думаю, что с помощью предложения group by мы используем параметр 'having', а не 'where'. – stackuser

+0

Вы можете использовать 'where' перед' group by' и 'having' после' group by'. – Utsav

+0

@Utsav, и? Все еще не равные функциональные возможности. – jarlh

0

Эта ошибка возникает, поскольку предложение, используемое при наличии, не является частью группы. Запишите текст как select job, sum(Sal * 12) from SO_EMP group by job, (extract(year from hiredate)) having(extract(year from hiredate)) = '1981';