Объединение двух SQL запросов к одной таблице - MySQL

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Возникла проблема с SQL запросом, раньше с таким не сталкивался. Имеется два запроса:
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
Пробовал делать подзапрос в FROM (уже не могу найти пример кода), и прочие варианты, но всегда неудача, возвращается-то полная сумма всех полей, то вообще чёрти что. Помогите пожалуйста.

Решение задачи: «Объединение двух 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.

  1. Внутренний запрос (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.
  2. Внешний запрос (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 встречается и в первом, и во втором запросе).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5