Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/618: Рейтинг темы: голосов - 618, средняя оценка - 4.71
4 / 4 / 7
Регистрация: 21.02.2013
Сообщений: 71
1

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

28.02.2013, 11:35. Показов 123007. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Возникла проблема с SQL запросом, раньше с таким не сталкивался.
Имеется два запроса:

SQL
1
2
3
4
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
и

SQL
1
2
3
4
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
Каждый из них возвращает таблицу вида:

SQL
1
2
3
4
5
6
7
8
9
+-----------------+----------+
| manager_vydacha | COUNT(*) |
+-----------------+----------+
| Иванов          | 100      |
+-----------------+----------+
| Петров          | 20       |
+-----------------+----------+
| Сидоров         | 70       |
+-----------------+----------+
Требуется объединить эти два запроса в один, чтобы он возвращал таблицу вида:

SQL
1
2
3
4
5
6
7
8
9
+-----------------+----------+----------+
| manager_vydacha | COUNT(*) | COUNT(*) |
+-----------------+----------+----------+
| Иванов          | 100      | 80       |
+-----------------+----------+----------+
| Петров          | 20       | 20       |
+-----------------+----------+----------+
| Сидоров         | 70       | 65       |
+-----------------+----------+----------+
Ни как не пойму, как это сделать. Пробовал что-то вроде:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
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 (уже не могу найти пример кода), и прочие варианты, но всегда неудача, возвращается-то полная сумма всех полей, то вообще чёрти что.
Помогите пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2013, 11:35
Ответы с готовыми решениями:

SQL. Объединение полей в одной таблице
Есть такой скрипт который выводит две таблицы. Наименования с типом String и подсчет с типом Long....

Объединение запросов из одной таблицы
В таблице есть поле date, надо выбрать все записи из будущего и пять записей до текущей даты. Т.е....

Объединение запросов sql
Создала 2 запроса: ADOQuery2.sql.Text:=('select * from predpr where data >=(:date1)');...

Объединение SQL запросов
Здравствуйте! Подскажите пожалуйста! Есть база данных в Access. В С++ Builder 6 подключены...

21
25 / 25 / 7
Регистрация: 27.02.2013
Сообщений: 113
28.02.2013, 11:47 2
Попробуйте операцию UNION(объединение):
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
UNION
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
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
28.02.2013, 12:04 3
Лучший ответ Сообщение было отмечено как решение

Решение

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
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
Если менеджеры в 2-х запросах могут не совпадать, тогда LEFT JOIN
5
4 / 4 / 7
Регистрация: 21.02.2013
Сообщений: 71
28.02.2013, 14:41  [ТС] 4
Grossmeister, спасибо огромное.
0
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
23.04.2014, 18:09 5
Привет всем.
В продолжение темы сложных запросов.
У меня схожая задача.
Есть табличка firma сотрудников какой-то компании, которая содержит поля:
-департамент(int),
-пол сотрудника(char 'm' или 'f')

Нужно вывести результирующую таблицу в виде:

------------------------------------------------------------------------------------------------
department________________|_________M______|_______F___________
------------------------------------------------------------------------------------------------
id-департамента___________|Количество мужчин|Количество женщин
------------------------------------------------------------------------------------------------


Другими словами, нужно посчитать, сколько в каждом департаменте работает мужчин и сколько женщин.
Причем могут быть департаменты
А) строго мужские или строго женские
Б) смешанные
В) с 0 человек.

Отталкиваясь от вышеуказанного примера,
у меня получилось нечто работающее но дающее неадекватный результат (условия А и В не выполняются ):

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT T1.department,   T1.cnt1 AS M, T2.cnt2 AS F
FROM
  (SELECT firma.department, COUNT( firma.SEX) AS cnt1
   FROM firma
   WHERE     firma.SEX ='m'
   GROUP BY department
   ) T1,
 
  (SELECT firma.department, COUNT( firma.SEX) AS cnt2
   FROM firma
   WHERE     firma.SEX ='f'
   GROUP BY department
   ) T2
WHERE T2.department = T1.department
Подскажите, как правильно реализовать SQL запрос.
Так же буду благодарен за ссылку на толковую литературу по сложным SQL запросам на русском.
Заранее спасибо.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
23.04.2014, 18:20 6
зачем так сложно-то???
MySQL
1
2
3
4
5
6
7
8
SELECT 
  firma.department, 
  SUM(firma.SEX='m') AS M,
  SUM(firma.SEX='f') AS F,
  COUNT(*) AS Total
FROM firma
-- WHERE firma.SEX in ('m','f')
GROUP BY firma.department
1
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
23.04.2014, 19:37 7
Увы что-то опять не то.
cygapb-007, проверял Ваш код

На выходе должно быть что-то типа
department___M___F
1___3___2
2___2___3
3___3___2
4___0___1
5___1___0
6___0___0

ну или пустые поля вместо нулей.

Добавлено через 48 минут
cygapb-007, проверял Ваш код
Результаты получаются отрицательными, хотя по модулю значения верные

Добавлено через 5 минут
PS
завернул в ABS - все работает почти верно. ура!
SQL
1
2
3
4
5
6
7
8
SELECT 
  firma.department, 
  ABS (SUM(firma.SEX='m')) AS M,
  ABS (SUM(firma.SEX='f')) AS F,
  COUNT(*) AS Total
FROM firma
WHERE firma.SEX IN ('m','f')
GROUP BY firma.department
единтвенно что - не обрабатываются ситуации
когда сотрудников в отделе 0
6___0___0
Насчет книжки по сложным запросам посоветуете что-нибудь?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
23.04.2014, 19:54 8
Цитата Сообщение от cosogor Посмотреть сообщение
Результаты получаются отрицательными
чушь какая-то... Как может быть отрицательной сумма 0 и 1 ?
0
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
23.04.2014, 20:04 9
В MS JET может
вот что выплюнул ACCESS
https://db.tt/dO9ZckTu
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
23.04.2014, 22:19 10
Цитата Сообщение от cosogor Посмотреть сообщение
вот что выплюнул ACCESS
понятно.
снова "а тут светлее"

Предложенное решение работает только в MySQL
0
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
24.04.2014, 01:01 11
Спасибо и на том.
Завернул вызовы в ABS и все заработало.
Однако странно то , что SUM положительных чисел у MS JET дает отрицательное значение.
А COUNT - отработал корректно.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
24.04.2014, 09:20 12
cosogor, для Access, ятд, сработает такой вариант:
SQL
1
2
3
4
5
6
7
SELECT 
  firma.department, 
  SUM(IIF(firma.SEX='m',1,0)) AS M,
  SUM(IIF(firma.SEX='f',1,0)) AS F,
  COUNT(*) AS Total
FROM firma
GROUP BY firma.department
1
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 5
24.04.2014, 09:55 13
Да, работает идеально.
То , что доктор прописал.
+1 в карму
0
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 18
16.03.2015, 19:00 14
подскажите как записать условие: если известно значение первого столбца, а значение второго пустое

Карточка|Значение_1|Значение_2
1 | 100 | -
2 | - | 200
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 3
01.10.2015, 13:53 15
Люди, нужна Ваша помощь
имеется 2 запроса:
1: select h.name,s.name,s.serialnumber,s.type, s.disksize from storages s left join hardware h on h.id=s.hardware_id;
2: select s.name,s.memory from hardware s left join hardware h on h.id=s.memory;

по отдельности они успешно работают, но нужно объединить их, чтобы на выходе был результат:

| имя компа | имя HDD | serial HDD | type HDD | size HDD | size memory|

Заранее благодарю
0
25 / 25 / 7
Регистрация: 27.02.2013
Сообщений: 113
02.10.2015, 06:46 16
А какова структура таблиц?
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 3
02.10.2015, 07:41 17
я мало в этом разбираюсь, могу сказать, что это приложение OCS Inventory по сбору информации о комплектации компьютеров
0
25 / 25 / 7
Регистрация: 27.02.2013
Сообщений: 113
02.10.2015, 12:20 18
Например так:
Значение2 Is Null
или
Значение2 =Null
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 3
02.10.2015, 13:46 19
первый вариант
Значение2 Is Null
0
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 1
28.05.2017, 17:19 20
Помогите, пожалуйста, разобраться. Надо в SQLdeveloper из таблицы приказов приема-увольнения получить отчет в виде - название поликлиники - отчетный месяц (год вводится в качестве параметра) - число принятых - число уволенных. Пользуясь темой, написала такой код:
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT ORD_1.POLYCLINIC_NAME, ORD_1.REPORT_MONTH, ORD_1.HIRED, ORD_2.DISMISSED
FROM
  (SELECT POLYCLINIC_NAME, TO_CHAR(HIRING_DATE, 'MM') AS REPORT_MONTH, COUNT(*) AS HIRED
   FROM ORDER
   WHERE (TO_CHAR(HIRING_DATE, 'YYYY') = '&p_year')
   GROUP BY POLYCLINIC_NAME, TO_CHAR(HIRING_DATE, 'MM')
   ) ORD_1 FULL OUTER JOIN
  (SELECT POLYCLINIC_NAME, TO_CHAR(DISMISSAL_DATE, 'MM') AS REPORT_MONTH, COUNT(*) AS DISMISSED
   FROM ORDER
   WHERE (TO_CHAR(DISMISSAL_DATE, 'YYYY') = '&p_year')
   GROUP BY POLYCLINIC_NAME, TO_CHAR(DISMISSAL_DATE, 'MM')
  ) ORD_2
ON ((ORD_1.POLYCLINIC_NAME = ORD_2.POLYCLINIC_NAME)
AND  (ORD_1.REPORT_MONTH = ORD_2.REPORT_MONTH))
ORDER BY POLYCLINIC_NAME, REPORT_MONTH;
Исходная таблица и отчет при вводе в качестве параметра 2016 в прикрепленных файлах. Проблема в том, что если в месяц, когда кто-то был уволен, никто не был принят, то название поликлиники и отчетный месяц не выводятся. Я понимаю, что у меня выводятся эти столбцы из представления ord_1, в котором нет данных для ord_2, но как это реализовать? нельзя в select поставить or...
Миниатюры
Объединение двух SQL запросов к одной таблице   Объединение двух SQL запросов к одной таблице  
0
28.05.2017, 17:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2017, 17:19
Помогаю со студенческими работами здесь

SQL Объединение запросов
есть таблица с мобилами и их параметрами, я сделал поиск по всем параметрам по отдельности а чтобы...

Объединение sql запросов
Всем привет. У меня есть 2 таблицы (Expences, Profit) такого формата: Expences ID Date1 Summa...

Объединение двух запросов
Как объединить два запроса? Делаю так, показывает ошибку синтаксиса select top(1) тип,...

Объединение двух запросов
Здравствуйте! У меня проблема такого плана. Я сделал два запроса и вывел их на DataGrid. По...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru