MySQL: как написать запрос, удовлетворяющий двум или более условиям - PullRequest
0 голосов
/ 30 апреля 2018

Данные таблицы:

Departments: dept_id, dept_name
Employees: dept_id, emp_id, salary

Я пытался придумать запрос, который показывает dept_id, dept_name, среднюю зарплату конкретных отделов и количество сотрудников в этом отделе. Где отдел с менее чем 20 сотрудниками, а средняя зарплата на отделе менее 2000.

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

Это то, что я придумал для зарплаты

SELECT dept_id, salary
FROM employees
WHERE (salary) < 2000;

И я знаю, что это можно использовать для подсчета количества людей в отделе

SELECT count(*) as count,dept.dept_name
FROM employees 
INNER JOIN dept on employees.department_id = dept.department_id 
GROUP BY dept.dept_name;

Как мне реализовать его в одном запросе, чтобы он соответствовал спецификации?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018
SELECT count(*) as count,dept.dept_name, salary
FROM employees 
INNER JOIN dept on employees.department_id = dept.department_id 
GROUP BY dept.dept_name HAVING salary < 2000
0 голосов
/ 30 апреля 2018

Добавьте к вашему запросу предложение HAVING, которое ограничивается только отделами со средней зарплатой менее 2000.

SELECT
    d.dept_id,
    d.dept_name,
    COUNT(*) AS count
FROM employees e
INNER JOIN dept d
    ON e.department_id = d.department_id 
GROUP BY
    d.dept_id    -- or maybe GROUP BY d.dept_id, d.dept_name if this doesn't work
HAVING 
    COUNT(*) < 20 AND
    AVG(salary) < 2000;

Предложение WHERE применяется к отдельным записям, но предложение HAVING применяется к группам после запуска GROUP BY. В этом случае вы хотите последний.

Редактировать: Было бы лучше сгруппировать по столбцу dept_id, так как он всегда должен быть уникальным (и должен быть первичным ключом в этой таблице). Потенциальный риск группировки по названию отдела состоит в том, что два разных отдела могут иметь одно и то же имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...