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

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

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

Доброго времени суток. Возникла проблема с SQL запросом, раньше с таким не сталкивался. Имеется два запроса:
Листинг программы
  1. SELECT manager_vydacha, COUNT(*)
  2. FROM raw
  3. WHERE office IN ('1', '2', '3', '4') AND date_podgotovka BETWEEN '2012-01-01' AND '2012-12-31'
  4. GROUP BY manager_vydacha
и
Листинг программы
  1. SELECT manager_vydacha, COUNT(*)
  2. FROM raw
  3. WHERE office IN ('1', '2', '3', '4') AND date_vydacha BETWEEN '2012-01-01' AND '2012-12-31'
  4. GROUP BY manager_vydacha
Каждый из них возвращает таблицу вида:
Листинг программы
  1. +-----------------+----------+
  2. | manager_vydacha | COUNT(*) |
  3. +-----------------+----------+
  4. | Иванов | 100 |
  5. +-----------------+----------+
  6. | Петров | 20 |
  7. +-----------------+----------+
  8. | Сидоров | 70 |
  9. +-----------------+----------+
Требуется объединить эти два запроса в один, чтобы он возвращал таблицу вида:
Листинг программы
  1. +-----------------+----------+----------+
  2. | manager_vydacha | COUNT(*) | COUNT(*) |
  3. +-----------------+----------+----------+
  4. | Иванов | 100 | 80 |
  5. +-----------------+----------+----------+
  6. | Петров | 20 | 20 |
  7. +-----------------+----------+----------+
  8. | Сидоров | 70 | 65 |
  9. +-----------------+----------+----------+
Ни как не пойму, как это сделать. Пробовал что-то вроде:
Листинг программы
  1. SELECT (
  2. SELECT COUNT(*)
  3. FROM raw
  4. WHERE date_podgotovka BETWEEN '2012-01-01' AND '2012-12-31'
  5. ), (
  6. SELECT COUNT(*)
  7. FROM raw
  8. WHERE date_vydacha BETWEEN '2012-01-01' AND '2012-12-31'
  9. )
  10. FROM raw
  11. WHERE office IN ('1', '2', '3', '4')
  12. GROUP BY office
Пробовал делать подзапрос в FROM (уже не могу найти пример кода), и прочие варианты, но всегда неудача, возвращается-то полная сумма всех полей, то вообще чёрти что. Помогите пожалуйста.

Решение задачи: «Объединение двух SQL запросов к одной таблице»

textual
Листинг программы
  1. SELECT T1.manager_vydacha, T1.cnt1, T2.cnt1
  2. FROM
  3.   (SELECT manager_vydacha, COUNT(*) AS cnt1
  4.    FROM raw
  5.    WHERE office IN ('1', '2', '3', '4') AND date_podgotovka BETWEEN '2012-01-01' AND '2012-12-31'
  6.    GROUP BY manager_vydacha
  7.    ) T1,
  8.   (SELECT manager_vydacha, COUNT(*) AS cnt1
  9.    FROM raw
  10.    WHERE office IN ('1', '2', '3', '4') AND date_vydacha BETWEEN '2012-01-01' AND '2012-12-31'
  11.    GROUP BY manager_vydacha
  12.   ) T2
  13. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут