#sql #database #postgresql #select
#sql #База данных #postgresql #выберите
Вопрос:
У меня есть 2 таблицы, employees и classes_taken. Я пытаюсь выяснить, какие сотрудники прошли более 2 классов. Однако я получаю эту ошибку ERROR: aggregate functions are not allowed in WHERE Position: 87
.
CREATE TABLE employees (
id integer primary key,
name text
);
CREATE TABLE classes_taken (
employee integer,
class text,
foreign key (employee) references employees(id)
);
INSERT INTO employees (id, name) VALUES
(1, 'bob'), (2, 'sam'), (3, 'mike');
INSERT INTO classes_taken (employee, class) VALUES
(1, 'swimming'), (1, 'dancing'), (2, 'swimming'), (2, 'tennis'), (3, 'golf'), (3, 'dancing');
Мой оператор выбора.
select e.id, e.name
FROM employees e
JOIN classes_taken c
ON e.id = c.employee
WHERE count(c.class) > 2
GROUP BY c.class;
SQLFiddle: http://sqlfiddle.com /#!15/5296cb/4
Комментарии:
1. агрегированные функции должны быть отфильтрованы с использованием предложения «HAVING».
2. Что сказал @Gouri, плюс ваши
group by
потребности должны быть включеныe.id, e.name
, а неc.class
. sqlfiddle.com /#!15/12a67/1
Ответ №1:
Вам нужно сохранить фильтр count в предложении HAVING, потому что он относится к агрегированному значению.
select e.id, e.name
FROM employees e
INNER JOIN classes_taken c ON e.id = c.employee
GROUP BY e.id, e.name
HAVING count(c.class) > 2
Комментарии:
1. Примечание: предполагая
id
, что это первичный ключemployees
таблицы, вам понадобится толькоGROUP BY e.id
для Postgres.