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

Есть сводная таблица: покупатель, группа товара, товар, количество

например.
================
Покупатель: Антон

Группа товара: Соки
Товар: яблочный - 2 литра, виноградный - 1 литр, томатный - 3 литра

Группа товара: Крупы
Товар: Гречка - 3 кг, рис - 2 кг, ячка - 1 кг.

и т.д.
=================
Задача.
Для каждого покупателя выбрать по каждой группе наиболее покупаемый товар. Т.е должно получиться
=================
Покупатель: Антон

Группа товара: Соки
Товар: томатный - 3 литра

Группа товара: Крупы
Товар: Гречка - 3 кг,
=================
Я таблицу просто записал немного по другому

Это надо сделать запросами. Помню, что когда-то такое делал, но сейчас никак не могу вспомнить как?


-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792509
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss, сначала сгруппировать по покупателю, группе, максимальное значение в группе. Далее внутреннее соединение (INNER JOIN) основной таблицы с запросом по полям - по покупателю, группе, максимальному значению в группе.

Что делать при двух и более товаров в одинаковом количестве?

не проверял...
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792577
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, по пути домой что-то такое в голове вертелось. Счас попробую.
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792595
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossЕсть сводная таблица: покупатель, группа товара, товар, количествоЯ верно понимаю, что:
1) (покупатель, группа товара, товар) - уникально
2) группа товара (1:М) товар
3) все поля NOT NULL
?
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792655
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,

Я так думаю - тебе задачу на пальцах объяснили, примерно так, как ты сейчас тут, уверен если бы был пример таблица-вход, таблица-выход, то и поста бы небыло...
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792719
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaJossЕсть сводная таблица: покупатель, группа товара, товар, количествоЯ верно понимаю, что:
1) (покупатель, группа товара, товар) - уникально
2) группа товара (1:М) товар
3) все поля NOT NULL
? Не совсем так. Покупатель может заказывать одинаковый товар несколько раз в течении обрабатываемого периода, так что я сначала сделал запрос за период. где суммировал все закупки покупателя. И да. В полученной таблице/запросе все записи уникальны.
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792724
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagJoss,

Я так думаю - тебе задачу на пальцах объяснили, примерно так, как ты сейчас тут, уверен если бы был пример таблица-вход, таблица-выход, то и поста бы небыло... Дело в том, что это типичные задачи (там ещё парочка есть). Я даже на каких-то курсах в интернете похожее встречал. И решал когда-то. Но сейчас голова совсем другим забита и никак переключиться на новую тему не может.

И отказаться нельзя...
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792933
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну эту проблему я решил 4-мя последовательными запросами.

Подкинули другую. Рассчитать интервалы между заказами для каждого заказчика. Вот сижу, чешу репу. Не знаю, с какой стороны за это задание браться.
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39792992
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossНу эту проблему я решил 4-мя последовательными запросами.так показал бы. Вдруг ещё кто будет искать. Но только как полагается - табличка исходных данных, решение.
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793139
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, сейчас выложу. Решал на основе таблиц базы Northwind.mdb

1. Подсчитываем кто чего и сколько купил.
Вот этот запрос - qrt6

Код: sql
1.
2.
3.
SELECT Orders.CustomerID, [Order Details].ProductID, Products.ProductName, Sum([Order Details].Quantity) AS SumQuantity, Products.CategoryID, Categories.CategoryName
FROM (Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID) INNER JOIN (Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID
GROUP BY Orders.CustomerID, [Order Details].ProductID, Products.ProductName, Products.CategoryID, Categories.CategoryName



2. На основе этого запроса подсчитываем максимальные покупки по категориям
Вот этот запрос - qrt7

Код: sql
1.
2.
3.
SELECT qrt6.CustomerID, qrt6.CategoryID, qrt6.CategoryName, Max(qrt6.SumQuantity) AS MaxSumQuantity
FROM qrt6
GROUP BY qrt6.CustomerID, qrt6.CategoryID, qrt6.CategoryName



3. Теперь связываем запрос qrt7 с запросом qrt6 по полям CategoryID, CustomerID и .SumQuantity = MaxSumQuantity
Получаем вот такой запрос qrt8

Код: sql
1.
2.
SELECT qrt6.CustomerID, qrt6.CategoryID, qrt6.CategoryName, qrt6.ProductID, qrt6.ProductName, qrt7.MaxSumQuantity
FROM qrt6 INNER JOIN qrt7 ON (qrt6.SumQuantity = qrt7.MaxSumQuantity) AND (qrt6.CategoryID = qrt7.CategoryID) AND (qrt6.CustomerID = qrt7.CustomerID);


4. А теперь добавляем таблицу Customers и берём данные о клиенте

Код: sql
1.
2.
SELECT Customers.CustomerID, Customers.ContactName, qrt8.CategoryID, qrt8.CategoryName, qrt8.ProductID, qrt8.ProductName, qrt8.MaxSumQuantity
FROM qrt8 INNER JOIN Customers ON qrt8.CustomerID = Customers.CustomerID;
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793221
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossРешал на основе таблиц базы Northwind.mdb А там нечто похожего не было? Уже и не помню, а под рукой нет...

JossПодкинули другую. Рассчитать интервалы между заказами для каждого заказчика. Вот сижу, чешу репу.так вроде не сложно. можно, например, через коррелированный подзапрос. Это если я правильно понял.
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793435
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот здесь можно скачать базы Northwind.mdb и Борей
http://www.cyberforum.ru/ms-access/thread838709.html
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793439
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургJossРешал на основе таблиц базы Northwind.mdb А там нечто похожего не было? Уже и не помню, а под рукой нет... Не разобрался, было или нет. А описания базы нет. Холя где-то в сети пробегало. На ней многие примеры и курсы основаны. Да и в книгах по Access она упоминается.

ПанургJossПодкинули другую. Рассчитать интервалы между заказами для каждого заказчика. Вот сижу, чешу репу.так вроде не сложно. можно, например, через коррелированный подзапрос. Это если я правильно понял. Поясни пожалуйста, что имел ввиду?
Примитивная таблица из двух полей. Заказчик, дата заказа. Рассчитать интервалы между заказами для каждого заказчика. И составить список (выборку), у которых интервалы были не больше месяца (2, 3, полгода).
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793452
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossДля каждого покупателя выбрать по каждой группе наиболее покупаемый товар.
Что нужно вывести, если в группе есть два разных товара с одинаковым максимальным количеством. Оба товара? Один (какой)?
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793468
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossПоясни пожалуйста, что имел ввиду?
Примитивная таблица из двух полей. Заказчик, дата заказа. Рассчитать интервалы между заказами для каждого заказчика. И составить список (выборку), у которых интервалы были не больше месяца (2, 3, полгода).
Если я правильно понял задачу
Таблица
IDCustomerIDDateOrder111.3.20192110.3.20193120.3.20194130.3.2019521.3.20196210.4.20197220.5.20198230.6.2019

Код: sql
1.
2.
3.
4.
SELECT t1.ID, t1.DateOrder, (SELECT Min(t2.DateOrder) 
FROM tbl AS t2
WHERE t2.CustomerID=t1.CustomerID AND t2.DateOrder>t1.DateOrder)-[DateOrder] AS DateDifference
FROM tbl AS t1;

Результат
CustomerIDDateOrderDateDifference11.3.20199110.3.201910120.3.201910130.3.201921.3.201940210.4.201940220.5.201941230.6.2019
Дописать условие фильтрации, я думаю, не составит труда
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793474
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поле не то написал, поправил...

Панург
Код: sql
1.
2.
3.
4.
SELECT t1.CustomerID, t1.DateOrder, (SELECT Min(t2.DateOrder) 
FROM tbl AS t2
WHERE t2.CustomerID=t1.CustomerID AND t2.DateOrder>t1.DateOrder)-[DateOrder] AS DateDifference
FROM tbl AS t1;
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793509
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,
процедура вычисляет минимальный период заказа, главное здесь показано как собрать в общий массив: массив заказчиков и массив заказов, учитывая что массив заказов у каждого заказчика свой-решение чисто экселевское

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
делаем пользовательский тип данных
Type mejdyZakazami
Zakazchik as long' заказчик
Periods() as long ' периоды заказа
DataZakaz as date' последняя запомненная дата
end type
Private sub PoiskPeriods()
const tbl$="table1" ' таблица в которой начальные данные
cont tbl2$="table2"
dim rst as recordset, i&, y&, messPeriod() as  mejdyZakazami, Period, tblPeriod  as recordset
' пройдемся по рекордсету и соберем в массивы заказчиков и периоды между заказами
set rst=Currentdb.openrecordset(tbl, dbOpensnapshot)
set tblPeriod  =Currentdb.openrecordset(tbl2, dbOpenDynaset)
if rst.absolutePosition=-1 then exit sub
with rst
.movefirst
redim messPeriod(0): redim messPeriod(0).Periods(0) ' инициализируем массивы иначе дальше выдаст ошибку
messPeriod(0).Zakazchik =.fields(1):messPeriod(0).DataZakaz =.fields(2): messPeriod(0).Periods(0)=0 ' начальный период 0
.movenext
do until .eof
for i=0 to ubound(messPeriod)
If rst.fields(1)=messPeriod(i).Zakazchik then 
   Period=DateAdd("y",rst.fields(2), messPeriod(i).DataZakaz) ' вычисляем интервал между текущим и последним запомненным
   redim Preserve messPeriod(i).Periods(ubound(messPeriod(i).Periods)+1):messPeriod(i).Periods(ubound(messPeriod(i).Periods))=Clng(Period)
    messPeriod(i).DataZakaz=.fields(2)
    goto go11 ' создаем новый элемент массива периодов этого заказчика
end if
next i
redim Preserve messPeriod(i): redim messPeriod(i).Periods(0)' если такого заказчика нет ещё добавляем его
messPeriod(i).Zakazchik =.fields(1): messPeriod(i).Periods(0)=0: messPeriod(i).DataZakaz=.fields(2)
go11:
.movenext
loop
end with
' далее смотрим массив периодов в массиве заказчиков
for i=0 to ubound(messPeriod) ' массив заказчиков
Period=messPeriod(i).Periods(0) 
for y=1 to ubound(messPeriod(i).Periods) ' массив периодов-начальный период 0 - поэтому пропустим его
if Period<messPeriod(i).Periods(y) then Period=messPeriod(i).Periods(y) ' минимальный период по этому заказчику
next y
' здесь добавляем в таблицу заказчика и получившийся период
with tblPeriod ' какая то таблица в которую записываем результат
.addnew
.fields(1)=messPeriod(i).Zakazchik: .fields(2)=Period
.update
end with
next i
rst.close: set rst=nothing
erase  messPeriod
end sub



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

Панург
Код: sql
1.
2.
3.
4.
SELECT t1.CustomerID, t1.DateOrder, (SELECT Min(t2.DateOrder) 
FROM tbl AS t2
WHERE t2.CustomerID=t1.CustomerID AND t2.DateOrder>t1.DateOrder)-[DateOrder] AS DateDifference
FROM tbl AS t1;



Использование подзапросов. Я о них только сегодня вспоминал. Я решил эту задачу иначе. Дико. Аж самому стыдно, но на удивление верно. И без подзапросов.
...
Рейтинг: 0 / 0
Прошу помощи в формировании запроса.
    #39793540
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleckoJoss,
процедура вычисляет минимальный период заказа, главное здесь показано как собрать в общий массив: массив заказчиков и массив заказов, учитывая что массив заказов у каждого заказчика свой-решение чисто экселевское

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


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