Объединение двух 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
встречается и в первом, и во втором запросе).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д