Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Объединение двух запросов с разделением данных по разным столбцам.

Есть вот такой запрос к двум таблицам:

CODE (SQL):

  1. SELECT label_id,label,COUNT(label) AS qnty_stock FROM stock GROUP BY label
  2. UNION
  3. SELECT label_id,label,COUNT(label) AS qnty_tranzit FROM tranzit WHERE sht="Stock" GROUP BY label


В данном виде запрос естественно выдает три столбца:

CODE (SQL):

  1. label_id label    qnty_stock
  2. 123      MB-170   1          
  3. 342      MS-174   1          


А нужно четыре. Чтобы количества из каждого запроса были в своем столбце:

CODE (SQL):

  1. label_id label    qnty_stock  qnty_tranzit
  2. 123      MB-170   1           0
  3. 342      MS-174   0           1



Я бы мог разделить по столбцам средствами PHP, но для этого надо знать, из какой таблицы пришел результат.
Пробовал использовать $meta = mysql_fetch_field($r, 0) и потом сделать условие по имени таблицы $meta->table, но он работает для каждого запроса по отдельности, а при использовании UNION не выдает ничего.

Какие еще есть выходы из ситуации?

(Отредактировано автором: 26 Октября, 2017 - 17:29:49)

Ответ:
Так и сделайте 4 столбца. union'у всё равно что объединять, была бы только структура совместимая
И кстати union all, а не union.

CODE (SQL):

  1. SELECT label_id,label,COUNT(label) AS qnty_stock, NULL AS qnty_tranzit FROM stock GROUP BY label
  2. UNION ALL
  3. SELECT label_id,label,NULL, COUNT(label) AS qnty_tranzit FROM tranzit WHERE sht="Stock" GROUP BY label


Можно и понимать от какого union какие данные приплыли:
CODE (SQL):

  1. SELECT label_id,label,COUNT(label) AS qnty, 'stock' AS tablename FROM stock GROUP BY label
  2. UNION ALL
  3. SELECT label_id,label,COUNT(label) AS qnty, 'tranzit' AS tablename FROM tranzit WHERE sht="Stock" GROUP BY label


-----
PostgreSQL DBA
Вопрос: Объединение двух таблиц

есть две таблицы, состоящие из одного столбца

первая
1
2
3

вторая
4
5

нужно объединить их в третью, состоящую из двух столбцов по принципу всех записей со всеми:

1 4
1 5
2 4
2 5
3 4
3 5

как это сделать с помощью запроса?
Ответ:
Сообщение от drukin
то же самое что и здесь получилось - Объединение двух таблиц
Нет, не так. По ссылке декартово умножение 2 таблиц, где количество записей равно произведению записей обоих таблиц, в представленной БД это будет 30 (10 * 3). По моему варианту количество записей равно 10, т.е. равноCount(Таблица1.*), а последовательность f1 из второй таблицы тождественна Вашему примеру в Таблица3. ТЗ выполнено.
Вопрос: Соединить два запроса в один отчёт

Добрый день. Существует два запроса с одинаковыми полями, но с разными данными. Задача объединить два запроса. Если делать это через виздар, то получается белеберда. в Access работаю второй день, c SQL толком не знаком. Прошу вашей помощи.

код первого запроса: TRANSFORM Count(Link_Order_Pr.User_ID) AS CountOfUser_ID
SELECT Products.[Tech discription], License.Name
FROM ((Platform INNER JOIN (License INNER JOIN Link_LicienceUsageByPlatform ON License.ID_License = Link_LicienceUsageByPlatform.ID_License) ON Platform.ID_Platform = Link_LicienceUsageByPlatform.ID_Platform) INNER JOIN ((Application INNER JOIN (Products INNER JOIN Link_IS_P ON Products.Prod_ID = Link_IS_P.Prod_ID) ON Application.Serv_ID = Link_IS_P.Serv_ID) INNER JOIN Link_PlatformUsageByApp ON Application.ID_App = Link_PlatformUsageByApp.ID_App) ON Platform.ID_Platform = Link_PlatformUsageByApp.ID_Platform) INNER JOIN Link_Order_Pr ON Products.Prod_ID = Link_Order_Pr.Prod_ID
GROUP BY Products.[Tech discription], Application.Name, Platform.Name, License.Name
PIVOT Link_Order_Pr.OGL;


код второго запроса: TRANSFORM Count(Link_Order_Pr.User_ID) AS CountOfUser_ID
SELECT Products.[Tech discription], License.Name
FROM ((Application INNER JOIN (Products INNER JOIN Link_IS_P ON Products.Prod_ID = Link_IS_P.Prod_ID) ON Application.Serv_ID = Link_IS_P.Serv_ID) INNER JOIN (License INNER JOIN Link_LicienceUsageByApp ON License.ID_License = Link_LicienceUsageByApp.ID_License) ON Application.ID_App = Link_LicienceUsageByApp.ID_App) INNER JOIN Link_Order_Pr ON Products.Prod_ID = Link_Order_Pr.Prod_ID
GROUP BY Products.[Tech discription], Application.Name, License.Name, License.Amount, License.Units
PIVOT Link_Order_Pr.OGL;

я так понимаю надо их как то "склеить" чтобы они выводились корректно, но как это сделать не понимаю.
Ответ:
Анатолий ( Киев )
Если в данный момент у вас в двух запросах все поля совпадают, то не факт, что при других данных будет тот же результат

Хорошее замечание. Для использования в UNION необходимо будет задать список колонок, выводимых каждым запросом:
PIVOT Link_Order_Pr.OGL IN ('значение1','значение2','значение3',...)
Вопрос: Реализация двух запросов

Есть база данных, не получается сделать два запроса на SQL.
1. После ввода в диалоговом окне порядкового № участка, вывести на экран записи, содержащие следующие поля: порядковый № участка, Площадь участка, Состояние, № проекта, Название проекта, Общая площадь, Стоимость по каждому строению, находящемуся на этом участке.
Тут я не понимаю, что за диалоговое окно и как его связать с выборкой.

2. Вывести на экран записи, содержащие следующие поля: № участка, Площадь участка, Состояние для всех участков, на которых нет никаких построек.
Пытался сделать что-то такое: SELECT * FROM Участки, Строения_на_участках WHERE Участки.№_порядковый<>Строения_на_участках.№_порядковый;
Хорошего из этого ничего не вышло.

Буду очень признателен.

К сообщению приложен файл (Макет.rar - 28Kb)
Ответ:
dima2308
Есть база данных, не получается сделать два запроса на SQL.
1. После ввода в диалоговом окне порядкового № участка, вывести на экран записи, содержащие следующие поля: порядковый № участка, Площадь участка, Состояние, № проекта, Название проекта, Общая площадь, Стоимость по каждому строению, находящемуся на этом участке.
Тут я не понимаю, что за диалоговое окно и как его связать с выборкой.
диалоговое окно (само) появляется при запуске запроса, если этот запрос содержит ПАРАМЕТР - значение которого и надо ввести в этом диалоговом окне. Т.е. ваше задание как-бы намекает, что вам надо написать запрос с параметром в условии вашего запроса.

В виде SQL запрос с параметром в условии может выглядеть, например так:
SELECT * FROM Участки WHERE №_порядковый = [ВВЕДИТЕ № Участка]

dima2308
2. Вывести на экран записи, содержащие следующие поля: № участка, Площадь участка, Состояние для всех участков, на которых нет никаких построек.
Пытался сделать что-то такое: SELECT * FROM Участки, Строения_на_участках WHERE Участки.№_порядковый<>Строения_на_участках.№_порядковый;
Хорошего из этого ничего не вышло.

Для этого в запросе можно СВЯЗАТЬ ваши таблицы при помощи конструкции LEFT JOIN в таком духе:
SELECT Участки.* FROM Участки LEFT JOIN Строения_на_участках 
ON Участки.№_порядковый = Строения_на_участках.№_порядковый
WHERE Строения_на_участках.№_порядковый IS NULL
такой LEFT JOIN в сочетании с условием IS NULL выбирает записи первой таблицы, для которых НЕТ связанных записей во второй таблице
Вопрос: Объединить два запроса в один

Здравствуйте. у меня есть два запроса. не могу их объединить в один так как много таблиц сразу соединяю и аксес выдает ошибку что где-то неверно расставила скобки. помогите пожалуйста. И плюс нужно сгруппировать все по DepartmentID

1
SELECT DISTINCT dbo_Departments.DepartmentID, dbo_Employees.FIO
FROM (dbo_Abonents INNER JOIN dbo_Departments ON dbo_Abonents.DepartmentID=dbo_Departments.DepartmentID) INNER JOIN dbo_Employees ON dbo_Departments.EmployeeID=dbo_Employees.EmployeeID;

2
SELECT dbo_Subscriptions.Indekx, dbo_Publications.Title, dbo_Abonents.Address, dbo_Subscriptions.Period
FROM (dbo_Publications INNER JOIN dbo_Subscriptions ON dbo_Publications.Indekx=dbo_Subscriptions.Indekx) INNER JOIN dbo_Abonents ON dbo_Subscriptions.AbonentID=dbo_Abonents.AbonentID;
Ответ:
Сообщение от Anna16
есть два запроса. не могу их объединить в один так как много таблиц сразу соединяю и аксес выдает ошибку что где-то неверно расставила скобки
В Jet SQL есть неописанный в хелпе способ соединения таблиц. Сначала перечисляют все источники, а затем попарно соединяют. Способ очень прозрачный, запутаться трудно. В Вашем случае предложение FROM может быть такое (сомнения вызывает, что есть всего одна общая таблица для обоих запросов - dbo_Abonents).
SQL
1
2
3
4
5
FROM dbo_Abonents, dbo_Departments, dbo_Employees, dbo_Publications, dbo_Subscriptions, 
dbo_Abonents INNER JOIN dbo_Departments ON dbo_Abonents.DepartmentID=dbo_Departments.DepartmentID, 
dbo_Employees INNER JOIN dbo_Departments ON dbo_Departments.EmployeeID=dbo_Employees.EmployeeID,
dbo_Publications INNER JOIN dbo_Subscriptions ON dbo_Publications.Indekx=dbo_Subscriptions.Indekx,
dbo_Abonents INNER JOIN dbo_Subscriptions ON dbo_Subscriptions.AbonentID=dbo_Abonents.AbonentID
Вопрос: Не могу составить два запроса.

Здравствуйте, можете мне помочь составить два запроса?
1. как мне взять значение из таблицы user_personal в колонке name по айдишнику и вставить а другую таблицу?
2. Как мне проверить два колонки (id и user_id) есть ли значения этих ячеек в одной строке или нет?
Ответ:
artik12321
Здравствуйте, можете мне помочь составить два запроса?
1. как мне взять значение из таблицы user_personal в колонке name по айдишнику и вставить а другую таблицу?
2. Как мне проверить два колонки (id и user_id) есть ли значения этих ячеек в одной строке или нет?


update XXXX x
set yyy = ( select name from user_personal where user_id = x.user_id )
where xxx.pk = 42


select * from YYYY
where id is null and user_id is null




УЧИ SQL , или увольняйся!
Вопрос: Создание и объединение двух перекрестных запросов

Надо сделать таблицу в которой бы отображались два перекрестных запроса. 1 перекрестный запрос + сумма по столбцам. Запрос на сумму должен стать перекрестным именно в момент запроса, не раньше. Получилось 2 отдельных запроса - на сумму, и перекрестный как теперь сделать под перекрестным запросом, запрос на сумму перекрестный в одной таблице? В Union надо 3 столбца дописать.
Можно ли как-то связать UCHET_ED который есть в двух запросах. Т.К. нужно 2 строки(шапки) подряд один из которых порядковый номер id (UCHET_ED), а второе имя (ED.name). Еще я сталкиваюсь с такой проблемой что сумма в разных столбцах таблицы появляется. Поэтому надо как-то привязать uchet_ed
Вот как это должно выглядеть примерно:

|__name1___name2___name3___| ED.name
|___01______02______03______| UCHET_ED
|___35______12______24______| тут уже числа идут
|___20______10______1_______|
|___55______22______25______| тут сумма этих чисел


Вот как у меня получается
|__name1___name2___name3___| ED.name
|___01______02______03______| UCHET_ED
|___35______12______24______| тут уже числа идут
|___20______10______1_______|
|___25______55______22______| тут сумма этих чисел

Запрос перекрестный

TRANSFORM Sum(count_obr.[Count-UCHET_ED]) AS [Sum-Count-UCHET_ED]
SELECT count_obr.CODE, count_obr.SPV01502.name, count_obr.Выражение1
FROM count_obr
GROUP BY count_obr.CODE, count_obr.SPV01502.name, count_obr.Выражение1
PIVOT count_obr.ed.name;



Запрос на сумму
SELECT [%$##@_Alias].UCHET_ED, Sum([%$##@_Alias].[Count-UCHET_ED]) AS SUMMA
FROM (SELECT count_obr.LPU_ID, count_obr.Выражение1, count_obr.UCHET_ED, count_obr.[Count-UCHET_ED] 
  FROM count_obr 
  GROUP BY count_obr.LPU_ID, count_obr.Выражение1, count_obr.UCHET_ED, count_obr.[Count-UCHET_ED])  AS [%$##@_Alias]
GROUP BY [%$##@_Alias].UCHET_ED, [%$##@_Alias].Выражение1, [%$##@_Alias].LPU_ID;



Огромное спасибо, тем , кто напишет !
Ответ:
reaxson
Может не все поняли я делал запрос на сумма перекрестным и в другом запросе только объединял, но мне надо это сделать все в одном запрос объединение + перекрестный и чтобы столбцы совпадали по id name
.


наверняка есть екселевская простыня-аналог требуемого
она очень бы помогла в анализе желаемого
Вопрос: Объединение перекрестных запросов

У меня есть два запроса, один рассчитывает расход обоев, другой - расход краски. У обоих запросов в качестве строк используется месяц, а в качестве столбцов вид обоев или краски соответственно.
Мне хотелось бы объединить эти два запроса, чтобы строки были месяцами, а в столбцах виды обоев и краски.

Запрос 1:
SQL
1
2
3
4
5
6
7
8
TRANSFORM SUM([Пл_обоев]/[Площадь в рулоне, м^2]) AS Расход
SELECT MonthName(MONTH([Дата заказа])) & YEAR([Дата заказа]) AS Месяц
FROM Сотрудники INNER JOIN (Обои
 INNER JOIN Заказ ON Обои.[Код обоев] = Заказ.[Код обоев])
   ON Сотрудники.[Код отделки] = Обои.[Код отделки]
GROUP BY MonthName(MONTH([Дата заказа])) & YEAR([Дата заказа])
ORDER BY MonthName(MONTH([Дата заказа])) & YEAR([Дата заказа]) DESC 
PIVOT Обои.[Вид обоев];

Запрос 2:
SQL
1
2
3
4
5
6
7
8
TRANSFORM SUM([Пл_краски]*[Количество банок (1л) на 10 м^2]/10) AS Расход
SELECT MonthName(MONTH([Дата заказа])) & YEAR([Дата заказа]) AS Месяц
FROM (Краска INNER JOIN Заказ ON Краска.[Код краски] = Заказ.[Код краски])
 INNER JOIN Сотрудники
   ON Краска.[Код отделки] = Сотрудники.[Код отделки]
GROUP BY MonthName(MONTH([Дата заказа])) & YEAR([Дата заказа])
ORDER BY MonthName(MONTH([Дата заказа])) & YEAR([Дата заказа]) DESC 
PIVOT Краска.[Вид краски];

Помогите, пожалуйста, объединить их! Буду признательна!
Ответ: Если Вы точно знаете какие краски и обои будут всегда в полях запросов, то можно перечислить нужные поля
SQL
1
2
SELECT Запрос1.Месяц, Акриловая, Масляная, Бумажные, Виниловые, Фотообои 
FROM Запрос1 INNER JOIN Запрос2 ON Запрос1.Месяц=Запрос2.Месяц
Если набор полей все-таки может меняться, то для объединения надо точно указать поля в самих перекрестных запросах. Делается это в предложении Pivot запроса. Например для краски
SQL
1
PIVOT Краска.[Вид краски] IN ("Акриловая", "Масляная")
В таком формате пивота в перекрестном запросе всегда будут поля Акриловая и Масляная. Даже если эти названия отсутствуют в исходных данных
Вопрос: Замена в базе данных в столбце "Информация" весь текст на город

Добрый день!
Не могу решить вопрос, есть таблица:
БД1 столбцы: Номер, Дата, Информация

В поле "Информация" введён текст, в котором обязательно присутствует название города.
Нужно заменить в базе данных в столбце "Информация" весь текст на город (Славград, Королёв, Мытищи, Другие)

Пробовал через iif
Запрос отрабатывает, заменяет и выводит два столбца: уникальный номер и город.
Но обновить таблицу не могу UPDATE ругается:
Код SQL
1
2
3
4
5
6
7
UPDATE БД1
SET БД1.Информация =(SELECT Номер,
iif БД1.Информация LIKE '*Славград*', "Славград", 
iif БД1.Информация LIKE '*Королёв*', "Королёв", 
iif БД1.Информация LIKE '*Мытищи*', "Мытищи", 
iif БД1.Информация LIKE '*Другие*', "Другие" 
FROM БД1)
Можно конечно запрос iif сохранить в БД2, а потом:

Код SQL
1
2
3
UPDATE SAS
SET БД1.Информация =БД2.Информация
WHERE БД1.Номер=БД2.Номер
Но хочется обновить одним запросом, без промежуточных БД.

Добавлено через 14 минут
Выше UPDATE указал с ошибками.
Пробовал запрос:
Код SQL
1
2
3
4
5
UPDATE БД1
SET БД1.Информация =(SELECT iif (БД1.Информация LIKE '*Славград*', "Славград", 
iif (БД1.Информация LIKE '*Королёв*', "Королёв", 
iif (БД1.Информация LIKE '*Мытищи*', "Мытищи", "Другие"))))
FROM БД1)
Выпадает ошибка: В операции должен испльзоваться обновляемый запрос.
Ответ: Andrelol, сделайте это в двух разных запросах. В первом делаете те замены, для которых вхождение образца есть.

Во втором заменяете на "Другой" все остальные тексты.

Код SQL
1
2
3
UPDATE БД1 LEFT JOIN БД3 ON БД1.Информация=[БД3].[Город]
SET БД1.Информация = "Другой"
WHERE isnull([БД3].[Город]);
Вопрос: Объединение двух таблиц

Добрый день. помогите пожалуйста решить задачку.
Есть две таблицы с одинаковым количеством столбцом.
Необходимо объединить их в одну.
Таблица первая
Kamp zagr
----------- -----------
4586 58
4586 2
4586 100
4586 146
4586 302
4586 40

Таблица вторая

Kamp pzagr
----------- -----------
4586 160
4586 150
4586 302
4586 40

Необходимо сделать вот такой вид:
Kamp zagr pzagr
4586 58 160
4586 2 150
4586 100 302
4586 146 40
4586 302
4586 40

Делаю так
T-SQL
1
2
3
4
5
6
select  kamp,
 zagr,
 pzagr
from #f
left outer join 
 #p on #p.kamp=#f.kamp
,но получается в таком ввиде

kamp zagr pzagr
----------- ----------- -----------
4586 58 160
4586 2 160
4586 100 160
4586 146 160
4586 302 160
4586 40 160
4586 58 150
4586 2 150
4586 100 150
4586 146 150
4586 302 150
4586 40 150
4586 58 302
4586 2 302
4586 100 302
4586 146 302
4586 302 302
4586 40 302
4586 58 40
4586 2 40
4586 100 40
4586 146 40
4586 302 40
4586 40 40
Ответ: Виктория1992, ну если делать объединение при таких условиях, то получается полное декартово произведение. Каждая строка из первой таблицы сопоставляется каждой строке из второй таблицы, потому что ключи одинаковые и условие будет всегда выполнятся. Получается все соответствуют всем, отсюда и огромный результирующий вывод.
Мой совет, доделать таблицы, ввести идентификатор строки, заполнить его, актуализировать данные и потом уже думать над запросом.