#mysql #sql #join #sum
#mysql #sql #Присоединиться #сумма
Вопрос:
Я практикую запросы на примере базы данных в MySQL.
У меня есть таблица employee с первичным ключом emp_id.
У меня есть таблица works_with с составным ключом из emp_id и client_id. В нем также есть столбец total_sales.
Я пытаюсь написать запрос, который возвращает имя любого сотрудника, который продал в общей сложности более 100 000.
Я смог вернуть идентификатор сотрудника и общее количество для сумм более 100 000 вот так:
SELECT SUM(total_sales) AS total_sales, emp_id
FROM works_with
WHERE total_sales > 100000
GROUP BY emp_id;
Но я не уверен, как использовать это, чтобы также получить имя сотрудника. Я пробовал вложенные запросы, но безуспешно. Например, когда я пытаюсь это:
SELECT first_name, last_name
FROM employee
WHERE emp_id IN (
SELECT SUM(total_sales) AS total_sales, emp_id
FROM works_with WHERE total_sales > 100000
GROUP BY emp_id
)
Я получаю ошибку 1241: Операнд должен содержать 1 столбец (ы). Я полагаю, это потому, что я выбираю два столбца во вложенном запросе? Итак, как бы я справился с этой проблемой?
Ответ №1:
Просто join
:
select sum(w.total_sales) as total_sales, e.first_name, e.lastnmae
from works_with w
inner join employee e on e.emp_id = w.emp_id
group by e.emp_id
having sum(w.total_sales) > 10000;
Обратите внимание, что я использовал having
предложение, а не where
предложение: предположительно, вы хотите суммировать все продажи каждого сотрудника и фильтровать по этому результату. Ваш исходный запрос суммирует только отдельные значения, которые больше 100000.
Комментарии:
1. Спасибо, это было очень полезно. Итак, когда вы вводите «inner join employee e», что означает «e»? Означает ли это, что любое «e» ссылается на таблицу employee?
2. @butthash3030: да. Это называется псевдонимом таблицы.
3. Спасибо. Последний вопрос: было бы правильно сказать, что вы бы использовали
having
, а неwhere
, потому что это агрегированная функция?4. @butthash3030: да, вам нужно
having
фильтровать по агрегированному выражению (здесь,sum(w.total_sales)
).
Ответ №2:
Добавление к решению GMB.
Возьмите существующий Select и оберните его в производную таблицу / CTE:
SELECT e.first_name, e.last_name, big_sales.total_sales
FROM employee as e
join
(
SELECT SUM(total_sales) AS total_sales, emp_id
FROM works_with
GROUP BY emp_id
HAVING total_sales > 100000
) as big_sales
on e.emp_id = big_sales.emp_id
Теперь вы можете показать total_sales плюс сведения о сотруднике. Кроме того, это должно быть более эффективным, потому что вы агрегируете и фильтруете перед объединением.
Если вам нужно только показать сотрудника, вы можете использовать подзапрос (подобный тому, который вы пробовали), но он должен возвращать один столбец, т. Е. Удалять СУММУ из списка выбора:
SELECT first_name, last_name
FROM employee
WHERE emp_id IN (
SELECT emp_id -- , SUM(total_sales) AS total_sales
FROM works_with
GROUP BY emp_id
HAVING SUM(total_sales) > 100000
)