Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
Kirill_S
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 61
#1

Объединение запрос с условиями в один! - MS Access

20.05.2018, 21:00. Просмотров 229. Ответов 13
Метки нет (Все метки)

Всем доброго времени суток!

Ситуация следующая:
Есть таблица (назовем Kv), в ней есть поля - Цена (Назовем P), цена за метр. (назовем P_m2), микрорайон (назовем mkr), кол-во комнат (назовем KK)
Есть запрос на подсчет средней цены (и цены за метр) по микрорайону и количеству комнат

SQL
1
2
3
SELECT Avg(Kv.P) AS Цена, Avg(Kv.P_m2) AS Цена_м2
FROM Kv
WHERE (((Kv.KK)="1") AND ((Kv.mkr="14"));
Подскажите как объединить множество подобных запросов (с разницей в микрорайоне) в один, с целью использования его для источника данных.

Заранее всем ответившим, большое человеческое спасибо!
http://www.cyberforum.ru/ms-access/thread960989.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2018, 21:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Объединение запрос с условиями в один! (MS Access):

Объединение запросов в один запрос бд Расход материалов на выполнение плана
Есть 3 запроса: -Расход материалов на выполнение плана (запуск) Дата, Шифр...

Запрос с несколькими условиями
Подскажите, пожалуйста Как в одном запросе вывести такую информацию, как на...

Запрос с несколькими условиями
Здравствуйте Уважаемые! Необходимо опять Ваша помощь и вот в чем: Уважаемые...

В процедуре Sub не открывется запрос с условиями
Здравствуйте, коллеги! У меня интересная ситуация. Запрос...

Запрос на выборку с двумя условиями
Всем доброго времени суток, столкнулся с проблемой на выборку имеется таблица с...

13
ltv_1953
Эксперт MS Access
12768 / 5762 / 1091
Регистрация: 21.06.2012
Сообщений: 10,386
20.05.2018, 21:18 #2
Посмотрите запрос (группировка по микрорайону и кол-во комнат)
SQL
1
2
3
SELECT mkr, KK, Avg(P) AS Цена, Avg(P_m2) AS Цена_м2
FROM Kv
GROUP BY mkr, KK
0
Capi
1593 / 825 / 146
Регистрация: 12.06.2016
Сообщений: 1,747
20.05.2018, 21:37 #3
Не совсем понятно, что подразумеваете под объединением.

Вариант 1.
SQL
1
2
3
4
SELECT mkr, Avg(P) AS Цена, Avg(P_m2) AS Цена_м2 
FROM Kv 
WHERE KK="1"
GROUPE BY mkr
Вариант 2.
SQL
1
2
3
4
5
6
7
8
9
SELECT mkr, Avg(Kv.P) AS Цена, Avg(Kv.P_m2) AS Цена_м2 
FROM Kv 
WHERE Kv.KK="1" AND Kv.mkr="14"
UNION ALL
SELECT mkr, Avg(Kv.P) AS Цена, Avg(Kv.P_m2) AS Цена_м2 
FROM Kv 
WHERE Kv.KK="1" AND Kv.mkr="15"
UNION ALL
.......................
А почему числа в текстовом формате?
0
Kirill_S
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 61
20.05.2018, 22:09  [ТС] #4
ltv_1953 Спасибо за быстроту, завтра с утра попробую. Capi, UNION ALL точно не подойдет, необходимо иметь значения в отдельных столбцах, а не в одном. В последующем каждый столбец будет использоваться в качестве источника данных для своего поля в форме.
0
Capi
1593 / 825 / 146
Регистрация: 12.06.2016
Сообщений: 1,747
20.05.2018, 22:23 #5
почему числа в текстовом формате?
0
Kirill_S
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 61
20.05.2018, 22:37  [ТС] #6
Числа в текстовом так как есть названия микрорайонов в текстовом виде, а не числовом. ltv_1953 ваш код не подходит, так как микрорайонов много, а не один, соответственно и условий по ним много. Кстати а что если к микрорайонам добавить условие на планировку (назовем Plan)?! Capi, я тоже в этом русле думал, но надо без объединения в один столбец (чтобы для каждого условия был отдельный столбец).
Кстати Capi, спасибо за алгоритм, чтоб картинки в форме не мерцали, очень помог!!!!
0
Capi
1593 / 825 / 146
Регистрация: 12.06.2016
Сообщений: 1,747
20.05.2018, 23:04 #7
Пожалуйста.
А вот Вы мою просьбу проигнорировали...
Надеюсь, в этом году, если буду участвовать, не останетесь равнодушны.)))

Добавлено через 9 минут
SQL
1
2
3
4
5
6
SELECT -Avg(P*(mkr="14")) AS Цена_14, -Avg(P_m2*(mkr="14")) AS Цена_м2_14,
       -Avg(P*(mkr="15")) AS Цена_15, -Avg(P_m2*(mkr="15")) AS Цена_м2_15,
       -Avg(P*(mkr="16")) AS Цена_16, -Avg(P_m2*(mkr="16")) AS Цена_м2_16,
.................................
FROM Kv 
WHERE KK="1"
0
Kirill_S
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 61
21.05.2018, 11:06  [ТС] #8
Capi, обязательно не останусь!!! Я на форуме не совсем давно, и не очень то понял что это какой то конкурс важный ().
Что то, где то не так в Вашем коде, т.к. у меня значения вылезают совершенно не те (в реале цена по району 2.123.750р, а по коду получается 47.458р).
0
Capi
1593 / 825 / 146
Регистрация: 12.06.2016
Сообщений: 1,747
21.05.2018, 11:30 #9
Цитата Сообщение от Kirill_S Посмотреть сообщение
Я на форуме не совсем давно
А я еще недавнее.)))
Цитата Сообщение от Kirill_S Посмотреть сообщение
какой то конкурс важный
Да ну, важный! Просто развлечься.
Цитата Сообщение от Kirill_S Посмотреть сообщение
у меня значения вылезают совершенно не те (в реале цена по району 2.123.750р, а по коду получается 47.458р)
На базе бы посмотреть.
Но это только вечером, если выложите.
Не новее Access2007 смогу открыть.
0
Kirill_S
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 61
21.05.2018, 13:04  [ТС] #10
Ок, спасибо, база в "скрепке".
0
Вложения
Тип файла: rar БД.rar (256.4 Кб, 3 просмотров)
Capi
1593 / 825 / 146
Регистрация: 12.06.2016
Сообщений: 1,747
22.05.2018, 03:03 #11
Лучший ответ Сообщение было отмечено Kirill_S как решение

Решение

Kirill_S,

SQL
1
2
3
4
5
SELECT CCur(SUM(P*(mkr="14")) / SUM(mkr="14")) AS Цена_14, CCur(SUM(P_m2*(mkr="14")) / SUM(mkr="14")) AS Цена_м2_14,
       CCur(SUM(P*(mkr="15")) / SUM(mkr="15")) AS Цена_15, CCur(SUM(P_m2*(mkr="15")) / SUM(mkr="15")) AS Цена_м2_15,
       CCur(SUM(P*(mkr="16")) / SUM(mkr="16")) AS Цена_16, CCur(SUM(P_m2*(mkr="16")) / SUM(mkr="16")) AS Цена_м2_16
FROM Kv
WHERE KK="1"
1
Kirill_S
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 61
22.05.2018, 10:38  [ТС] #12
Бинго!
Спасибо в очередной раз, Capi, это то что надо!
Не могли бы Вы объяснить сей алгоритм? (Ну конечно, если будет время)
0
shanemac51
Модератор
Эксперт MS Access
7762 / 2980 / 423
Регистрация: 07.08.2010
Сообщений: 8,125
Записей в блоге: 1
22.05.2018, 11:14 #13
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
SELECT CCur(SUM(P*(mkr="14")) / SUM(mkr="14")) AS Цена_14,
 CCur(SUM(P_m2*(mkr="14")) / SUM(mkr="14")) AS Цена_м2_14,
       CCur(SUM(P*(mkr="15")) / SUM(mkr="15")) AS Цена_15,
 CCur(SUM(P_m2*(mkr="15")) / SUM(mkr="15")) AS Цена_м2_15,
       CCur(SUM(P*(mkr="16")) / SUM(mkr="16")) AS Цена_16,
 CCur(SUM(P_m2*(mkr="16")) / SUM(mkr="16")) AS Цена_м2_16,
      CCur(SUM(P*(-1)) / SUM(-1)) AS Цена_итого,
 CCur(SUM(P_m2*(-1)) / SUM(-1)) AS Цена_м2_итого
 
FROM Kv
WHERE KK="1"
если mkr="14", то (mkr="14")=true или -1, иначе 0
поэтому принципу позиция попадает в тот или иной столбец
0
Capi
1593 / 825 / 146
Регистрация: 12.06.2016
Сообщений: 1,747
22.05.2018, 13:10 #14
Цитата Сообщение от Kirill_S Посмотреть сообщение
Не могли бы Вы объяснить сей алгоритм? (Ну конечно, если будет время)
Конечно, объясню.
Если сейчас не успею, то опять вечером.

Добавлено через 9 минут
Цитата Сообщение от shanemac51 Посмотреть сообщение
поэтому принципу позиция попадает в тот или иной столбец
Неточно рассуждаете.
Попадает всегда во все столбцы.
Но с каким коэффициентом - в этом все дело.

Добавлено через 10 минут
Цитата Сообщение от shanemac51 Посмотреть сообщение
SQL
1
CCur(SUM(P*(-1)) / SUM(-1)) AS Цена_итого, CCur(SUM(P_m2*(-1)) / SUM(-1)) AS Цена_м2_итого
А вот здесь применение SUM(-1) совершенно не оправданно, логичнее просто Count(*).

Добавлено через 13 минут
Kirill_S,

Про коэффициенты, надеюсь, Вы уже поняли.

Теперь, почему не сработал Avg в моем первом запросе.
Видимо, Avg действует по формуле Сумма/Количество, при этом Количество определяется через Count.
И вроде следует ожидать верного результата от Сумма/Count((mkr="14")), но это не так,
поскольку Count условие игнорирует и действует, как будто указано Count(*), что в нашем случае дает 11,
то есть общее количество однокомнатных квартир по всем микрорайонам.
Поэтому и результаты такие были - все суммы (определявшиеся, в свою очередь, верно) делились на 11.
Оттого и пришлось отказаться от Count и определять количество однокомнатных квартир на каждый микрорайон через SUM(mkr="...")).

Добавлено через 4 минуты
Kirill_S,

Но можно и по-другому действовать - сделать буквально, как сформулирован Ваш вопрос, то есть,
именно "Объединить запрос с условиями в один".
Через INNER JOIN Ваших трех запросов, по признаку равенства значений mkr.

Добавлено через 1 час 3 минуты
Цитата Сообщение от Capi Посмотреть сообщение
по признаку равенства значений mkr
Опечатка. По признаку равенства KK.
Для этого в список полей каждого из отдельных запросов добавить "1" AS KK.
Общий запрос таков:
SQL
1
2
3
4
5
6
SELECT Цена_1ком_14, Цена_1ком_14_м2, 
       Цена_1ком_15, Цена_1ком_15_м2, 
       Цена_1ком_16, Цена_1ком_16_м2
FROM ([Средняя цена по 14 мкр] AS Q14
      INNER JOIN [Средняя цена по 15 мкр] AS Q15 ON Q14.KK = Q15.KK) 
      INNER JOIN [Средняя цена по 16 мкр] AS Q16 ON Q14.KK = Q16.KK
0
22.05.2018, 13:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2018, 13:10
Привет! Вот еще темы с решениями:

sql запрос для БазыДанных с условиями
Уваж Форумчане! Поправьте новичка! Пишу запрос для схемы БД! Дайте пару...

Объединение столбцов в один с условием
Здравствуйте! Очень нужна ваша помощь: необходимо написать запрос на...

Объединение нескольких столбцов в один
Добрый день, уважаемые форумчане. Возникла следующая проблема: Необходимо из...

Объединение запросов в один, использование условия
в запросе есть поле дата1, дата2, дата3 как сделать, чтобы при выполнении...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru