Объединение двух 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_vydachaSELECT 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встречается и в первом, и во втором запросе).