2013-02-14 1 views
1

Почему это SQL заявление:
select team,avg(salary) 'Average Salary' from orgchart group by team having salary <38000;Группа по с наличием на не aggergate функция не работает

дает следующее сообщение об ошибке?

MySQL> выберите команды, в среднем (зарплата) 'Средняя зарплата' из OrgChart группы по командой, зарплаты < 38000; ОШИБКА 1054 (42S22): Неизвестный столбец 'зарплата' в 'имеет пункт'

С group by я могу использовать только having и не where .Correct.
следующие работы:

select team,avg(salary) 'Average Salary' from orgchart group by team having avg(salary)<38000;

+2

_В группе с помощью я могу использовать только имеющийся, а не где.Correct._ ** Нет, это неверно. ** Если вы используете агрегированную функцию для фильтрации, то должен идти в том, что в противном случае вы можете использовать 'WHERE' для фильтрации ваших данных. – Taryn

ответ

7

HAVING используется для оценки группы строк. До группировки вы все равно можете оценить/отфильтровать строки отдельно, применяя к ним условие WHERE.

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

select team, avg(salary) 'Average Salary' 
from orgchart 
where salary < 38000 
group by team; 

при условии, что вы хотите, чтобы рассчитать среднюю зарплату среди людей с зарплатой ниже 38000 (отдельно для каждой команды).

Однако, если вы на самом деле пытаетесь отфильтровать команды где средняя зарплата меньше 38000, то having является правильным выбором, но вы должны сравнить avg(salary), а не salary, с заданным значением, т.е. как это:

select team, avg(salary) 'Average Salary' 
from orgchart 
group by team 
having avg(salary) < 38000; 
+0

Таким образом, проблема заключается в том, что 'where' * следует * a' group by'.Right? – Cratylus

+0

Нет, 'group by' следует' where'. Группировка выполняется * после * применяется фильтр 'where'. –