powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / подзапрос с having
20 сообщений из 20, страница 1 из 1
подзапрос с having
    #39901695
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите пожалуйста с запросом.
Пример взят с потолка, мне главное понять технический принцип.

есть две таблицы кластер и население (см. вложенный файл). Мне нужно написать запрос в котором бы выводилась информация, как на картинке1 в запросе1, только чтобы в поле sum_население суммировалось население по кластерам, т.е. чтобы например для Азии вместо 8 074 868 438,00 было бы 2 993 982 984,00

Код: sql
1.
2.
3.
SELECT кластер.кластер, население.страна, население.месяц, Sum(население.население) AS [Sum-население], (select sum(b.население) from [население] b, [кластер] c GROUP BY c.кластер HAVING (кластер.кластер=c.кластер)) AS sum_население
FROM кластер INNER JOIN население ON кластер.страна = население.страна
GROUP BY кластер.кластер, население.страна, население.месяц;
...
Рейтинг: 0 / 0
подзапрос с having
    #39901736
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо рисовать запрос руками - Вы пока слабоваты в этом. Сделайте мастером.

Создайте отдельный запрос, который считает сумму кластера в месяце (кластер-месяц-сумма_населения). Затем используйте его во втором запросе совместно с основной таблицей как источник данных.

После того, как всё правильно заработает, рассмотрите/изучите каждый запрос отдельно (лишние пары скобок можно будет поудалять - но не забудьте проверить, что запрос по-прежнему работает). Затем во втором запросе замените
Код: sql
1.
2.
FROM таблица 
INNER JOIN запрос1 ON ...

на
Код: sql
1.
2.
3.
FROM таблица 
INNER JOIN (текст запроса без финальной точки с запятой)
        AS запрос1 ON ...


Это и будет то, что Вы должны были нарисовать руками. Постарайтесь понять, что Вы сделали не так и почему, и почему так, как получилось - правильно.
...
Рейтинг: 0 / 0
подзапрос с having
    #39901869
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Намучался, но сделал так как было нужно. Может кому-то будет полезно!

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT кластер.кластер, население.страна, население.месяц, Sum(население.население) AS [Sum-население],
 
(SELECT  Sum(население.население) FROM кластер b INNER JOIN население ON b.страна = население.страна
GROUP BY b.кластер  having кластер.кластер=b.кластер) AS [Sum-Sum-население]

FROM кластер INNER JOIN население ON кластер.страна = население.страна
GROUP BY кластер.кластер, население.страна, население.месяц;
...
Рейтинг: 0 / 0
подзапрос с having
    #39901955
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может проще выражение:
Код: vbnet
1.
Dsum("население";"население";"кластер=" & [кластер] 


только для этого должна быть правильно создана схема БД-я не наблюдаю в тбл.население поля связи с тбл.кластер
И то что Вы выкладываете со словами "Может кому-то будет полезно!"-больше так не делайте
Мне то фиолетово, а вот начинающие сдуру будут думать что подобное решается именно так.
...
Рейтинг: 0 / 0
подзапрос с having
    #39901972
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
может проще выражение:
Код: vbnet
1.
Dsum("население";"население";"кластер=" & [кластер] 


только для этого должна быть правильно создана схема БД-я не наблюдаю в тбл.население поля связи с тбл.кластер
И то что Вы выкладываете со словами "Может кому-то будет полезно!"-больше так не делайте
Мне то фиолетово, а вот начинающие сдуру будут думать что подобное решается именно так.


Я конечно извиняюсь, но думаю, что с точки зрения классического SQL будет правильнее мой вариант. Не подумайте, что пытаюсь вас как-то боднуть, просто с научной точки зрения стало интересно какой все-таки вариант предпочтительнее. Да и таблицы у меня никак не связаны . т.е. обеспечение целостности данных не поддерживается.
...
Рейтинг: 0 / 0
подзапрос с having
    #39901978
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_s_e_r_g_e_,

Твой универсальней, при переезде на MySql или MS SQL этого запроса никаких ошибок не будет, встанет как родной.

А агрегатные функции типа DCount,DMax,DSum это плюшка чисто аксесовская, они тормозят работу /вычисления очень здорово, использую их только как одиночные поля на форме, для подсчета итоговых значений. В качестве вычисляемых функций, на уровне табличной формы (поля табличной формы) и увеличении количества строк приводят к слету фильтров и сортировки.
Аккуратней с ними)
...
Рейтинг: 0 / 0
подзапрос с having
    #39902006
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или еще проще:
...
Рейтинг: 0 / 0
подзапрос с having
    #39902023
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot _s_e_r_g_e_#22038864]
sdku
Да и таблицы у меня никак не связаны . т.е. обеспечение целостности данных не поддерживается.
Стесняюсь спросить:а зачем Вам тогда ACCESS. 2 таблицы-ну чем не 2 листа Ёкселя-вот в нем и работайте а Ваш подход к ACCESS абсолютно не правильный. И никакой "научной точки зрения" быть не может.
...
Рейтинг: 0 / 0
подзапрос с having
    #39902047
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot sdku#22038948]
_s_e_r_g_e_
пропущено...
Стесняюсь спросить:а зачем Вам тогда ACCESS. 2 таблицы-ну чем не 2 листа Ёкселя-вот в нем и работайте а Ваш подход к ACCESS абсолютно не правильный. И никакой "научной точки зрения" быть не может.


Sdku, во-первых пример, как я писал выше, взят с потолка и не связан с базой ,которую я использую. Мне нужно было понять , как в подзапросе можно делать сумму нарастающим итогом по признакам.
во-вторых, вы наверное в Экселе никогда не обрабатывали массивы(таблицы) данных под 100 тыс.строк и более, где будет все ужасно тормозить и могут слетать формулы. Гораздо проще , использовать Access даже если таблицы не связаны и написать единожды запрос и не беспокоиться, что у вас в какой-то ячейке слетит формула. извините за оффтоп.

С уважением, Сергей
...
Рейтинг: 0 / 0
подзапрос с having
    #39902088
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_s_e_r_g_e_

... вы наверное в Экселе никогда не обрабатывали массивы(таблицы) данных под 100 тыс.строк и более...
Конечно нет-с такими объемами EXCEL-нет слов
Совет:создайте БД,импортируйте в нее имеющиеся данные,в дальнейшем пользуйтесь ей,а не EXCEL(думаю это не займет времени больше чем Вы уже потратили,а в дальнейшем работа с данными значительно упростится)
...
Рейтинг: 0 / 0
подзапрос с having
    #39902092
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть желание выложите таблицы с реальными данными в Ёкселе,если не позволяет объем-многотомный архив или на почту(адрес в профиле.Болею,сижу дома,изнываю от безделья,помогу)
...
Рейтинг: 0 / 0
подзапрос с having
    #39902121
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите лучше пожалуйста с другим запросом в Access. Не могу понять почему не осуществляется группировка : мне нужно чтобы была группировка по месяцу, бренду и стране
...
Рейтинг: 0 / 0
подзапрос с having
    #39902138
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_s_e_r_g_e_
Помогите лучше пожалуйста с другим запросом в Access. Не могу понять почему не осуществляется группировка : мне нужно чтобы была группировка по месяцу, бренду и стране
...
Рейтинг: 0 / 0
подзапрос с having
    #39902140
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_s_e_r_g_e_
Помогите лучше пожалуйста с другим запросом в Access. Не могу понять почему не осуществляется группировка : мне нужно чтобы была группировка по месяцу, бренду и стране
...
Рейтинг: 0 / 0
подзапрос с having
    #39902141
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите лучше пожалуйста с другим запросом в Access. Не могу понять почему не осуществляется группировка : мне нужно чтобы была группировка по месяцу, бренду и стране.

Ссылка на файл


https://dropmefiles.com.ua/xsMS3vzV
...
Рейтинг: 0 / 0
подзапрос с having
    #39902145
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините месяц в группировке не нужен, вот так должно быть , только суммы не совпадают с исходными данными/
Подозреваю, что это из-за связи многие ко многим, если убрать месяц
...
Рейтинг: 0 / 0
подзапрос с having
    #39902217
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_s_e_r_g_e_
извините месяц в группировке не нужен, вот так должно быть , только суммы не совпадают с исходными данными/
Подозреваю, что это из-за связи многие ко многим, если убрать месяц


когда из первого запроса собираю второй, то все работает, но в итоге получается 2 запроса.

1 запрос

SELECT plan.страна, plan.бренд, plan.объем, Sum(факт.доставлено) AS SumOfдоставлено
FROM plan LEFT JOIN факт ON (plan.месяц = факт.месяц) AND (plan.бренд = факт.бренд) AND (plan.страна = факт.страна)
GROUP BY plan.страна, plan.бренд, plan.объем, plan.месяц;


2 запрос

SELECT Query1.страна, Query1.бренд, Sum(Query1.объем) AS SumOfобъем, Sum(Query1.SumOfдоставлено) AS SumOfSumOfдоставлено
FROM Query1
GROUP BY Query1.страна, Query1.бренд;


А как написать 1 запросом?
...
Рейтинг: 0 / 0
подзапрос с having
    #39902254
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_s_e_r_g_e_
... мне нужно чтобы была группировка по месяцу, бренду и стране...

стран 10,брендов 2-3 (считаем3),месяцев 12 перемножаем и получаем 10*3*12=360(у Вас 240 записей-не везде 3 бренда и 12 месяцев)
- что Вы хотели увидеть?
-для решения задачи её, как минимум, нужно понять а я не понимаю (что за поле SumOfдоставлено-какие в нем данные?)
-вычисления с плавающей точкой,в принципе,не дадут точного результата-либо денежный тип(до 4 знаков после запятой) с основным форматом,либо действительное со шкалой=количеству знаков после запятой(до 14)
-такой запрос решит Ваши проблемы(как я их понял-во всяком случае показано как применять DSUM) но навряд ли будет достаточно быстрым-до тех пор пока Вы не начнете создавать БД (таблицы) по правилам и принципам ACCESS
Код: vbnet
1.
2.
3.
SELECT plan.страна, plan.бренд, Sum(plan.объем) AS [Sum-объем], Format(DSum("доставлено","факт","страна='" & [страна] & "' and бренд='" & [бренд] & "'"),"Fixed") AS Выражение1
FROM plan
GROUP BY plan.страна, plan.бренд;
...
Рейтинг: 0 / 0
подзапрос с having
    #39902256
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ACCESS это СУРБД (система управления реляционными базами данных , а не отдельными таблицами)
...
Рейтинг: 0 / 0
подзапрос с having
    #39902482
_s_e_r_g_e_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал одним запросом!


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT plan.страна, Sum(plan.объем) AS SumOfобъем, (select  Sum(факт.доставлено) 
FROM plan b LEFT JOIN факт ON (b.месяц = факт.месяц) AND (b.бренд = факт.бренд) AND (b.страна = факт.страна)

GROUP BY b.страна  HAVING plan.страна=b.страна


) AS Доставлено



FROM plan
GROUP BY plan.страна;


и на выходе имеем, то что нужно
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / подзапрос с having
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]