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

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

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. ТЗ выполнено.
Вопрос: Реализация двух запросов

Есть база данных, не получается сделать два запроса на 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].[Город]);
Вопрос: Объединение двух запросов

Здравствуйте!

Есть таблица со статистикой поиска:
id, дата, строка

Нужно вытащить данные с группировкой по запросам за 30 последних суток

Делаю так. Получаю числа дней с текущего по 30 дней назад
SELECT DAY(DATE_SUB(CURDATE(), INTERVAL n DAY)) as d0 FROM
(SELECT t1.n FROM (SELECT 0 as n UNION SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION SELECT 25 UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29) as t1) as t2


А вот запрос для вывода статистики за определенные сутки:
SELECT date_stat, findstr, COUNT(id_stat) as cnt FROM stat WHERE DAY(date_stat) = "тут число из первого запроса" GROUP BY findstr


Как эти запросы объединить в один, или может есть еще способ... Делать несколько запросов внутри скрипта не очень хочется...
Ответ: Akina,

Спасибо, все получилось :)
Вопрос: Объединение двуз запросов Update

Здравствуйте,

Никак не получается объединить два запроса UPDATE

Допустим у меня есть два запроса.

Первый:
UPDATE Table SET [City] = 'Moscow'
WHERE (([City])='Москва')

Второй:
UPDATE Table SET [City] = 'Rome'
WHERE (([City])='Рим')

Вопрос: Как сделать так, чтобы эти два запроса выполнялись в одном запросе?

Буду очень признателен за помощь.
Ответ: Если ввести таблицу соответствия ,
то может оказаться, что UPDATE не потребуется,
ведь значение на нужном языке всегда можно получить запросом.