Объединение двух SQL запросов к одной таблице - MySQL
Формулировка задачи:
Доброго времени суток.
Возникла проблема с SQL запросом, раньше с таким не сталкивался.
Имеется два запроса:
и
Каждый из них возвращает таблицу вида:
Требуется объединить эти два запроса в один, чтобы он возвращал таблицу вида:
Ни как не пойму, как это сделать. Пробовал что-то вроде:
Пробовал делать подзапрос в FROM (уже не могу найти пример кода), и прочие варианты, но всегда неудача, возвращается-то полная сумма всех полей, то вообще чёрти что.
Помогите пожалуйста.
SELECT manager_vydacha, COUNT(*) FROM raw WHERE office IN ('1', '2', '3', '4') AND date_podgotovka BETWEEN '2012-01-01' AND '2012-12-31' GROUP BY manager_vydacha
SELECT manager_vydacha, COUNT(*) FROM raw WHERE office IN ('1', '2', '3', '4') AND date_vydacha BETWEEN '2012-01-01' AND '2012-12-31' GROUP BY manager_vydacha
+-----------------+----------+ | manager_vydacha | COUNT(*) | +-----------------+----------+ | Иванов | 100 | +-----------------+----------+ | Петров | 20 | +-----------------+----------+ | Сидоров | 70 | +-----------------+----------+
+-----------------+----------+----------+ | manager_vydacha | COUNT(*) | COUNT(*) | +-----------------+----------+----------+ | Иванов | 100 | 80 | +-----------------+----------+----------+ | Петров | 20 | 20 | +-----------------+----------+----------+ | Сидоров | 70 | 65 | +-----------------+----------+----------+
SELECT ( SELECT COUNT(*) FROM raw WHERE date_podgotovka BETWEEN '2012-01-01' AND '2012-12-31' ), ( SELECT COUNT(*) FROM raw WHERE date_vydacha BETWEEN '2012-01-01' AND '2012-12-31' ) FROM raw WHERE office IN ('1', '2', '3', '4') GROUP BY office
Решение задачи: «Объединение двух SQL запросов к одной таблице»
textual
Листинг программы
SELECT T1.manager_vydacha, T1.cnt1, T2.cnt1 FROM (SELECT manager_vydacha, COUNT(*) AS cnt1 FROM raw WHERE office IN ('1', '2', '3', '4') AND date_podgotovka BETWEEN '2012-01-01' AND '2012-12-31' GROUP BY manager_vydacha ) T1, (SELECT manager_vydacha, COUNT(*) AS cnt1 FROM raw WHERE office IN ('1', '2', '3', '4') AND date_vydacha BETWEEN '2012-01-01' AND '2012-12-31' GROUP BY manager_vydacha ) T2 WHERE T2.manager_vydacha = T1.manager_vydacha
Объяснение кода листинга программы
В этом коде два SQL-запроса (query) объединяются в один с помощью оператора JOIN.
- Внутренний запрос (query) в скобках:
a. SELECT manager_vydacha, COUNT() AS cnt1
FROM raw
WHERE office IN ('1', '2', '3', '4') AND date_podgotovka BETWEEN '2012-01-01' AND '2012-12-31'
GROUP BY manager_vydacha
Этот запрос сначала фильтрует строки в таблице
raw
по условию WHERE, затем группирует оставшиеся строки по полюmanager_vydacha
с помощью оператора GROUP BY. Для каждой группы вычисляется количество строк (то есть, сколько раз каждаяmanager_vydacha
встречается в таблицеraw
) с помощью функции COUNT(). Это количество присваивается псевдонимуcnt1
. - Внешний запрос (query):
b. SELECT T1.manager_vydacha, T1.cnt1, T2.cnt1
FROM (a) T1, (b) T2
WHERE T2.manager_vydacha = T1.manager_vydacha
Этот запрос объединяет результаты внутреннего запроса (query) с другим внутренним запросом, используя оператор JOIN. Поле
manager_vydacha
используется для соединения строк из обоих запросов. Результатом будет набор строк, где для каждойmanager_vydacha
будет указано количество строк, удовлетворяющих условиям в обоих запросах (то есть, сколько раз каждаяmanager_vydacha
встречается и в первом, и во втором запросе).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д