Выясните, какой сотрудник прошел больше обучения

#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.