Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Прошу помощи в формировании запроса. / 19 сообщений из 19, страница 1 из 1
27.03.2019, 16:35
    #39792462
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в формировании запроса.
Что-то голова не варит.
Подкинули задачку.

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

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

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

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

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

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

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

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


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

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

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

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

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

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

Подкинули другую. Рассчитать интервалы между заказами для каждого заказчика. Вот сижу, чешу репу. Не знаю, с какой стороны за это задание браться.
...
Рейтинг: 0 / 0
28.03.2019, 15:04
    #39792992
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в формировании запроса.
JossНу эту проблему я решил 4-мя последовательными запросами.так показал бы. Вдруг ещё кто будет искать. Но только как полагается - табличка исходных данных, решение.
...
Рейтинг: 0 / 0
28.03.2019, 17:00
    #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
28.03.2019, 17:57
    #39793221
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в формировании запроса.
JossРешал на основе таблиц базы Northwind.mdb А там нечто похожего не было? Уже и не помню, а под рукой нет...

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

ПанургJossПодкинули другую. Рассчитать интервалы между заказами для каждого заказчика. Вот сижу, чешу репу.так вроде не сложно. можно, например, через коррелированный подзапрос. Это если я правильно понял. Поясни пожалуйста, что имел ввиду?
Примитивная таблица из двух полей. Заказчик, дата заказа. Рассчитать интервалы между заказами для каждого заказчика. И составить список (выборку), у которых интервалы были не больше месяца (2, 3, полгода).
...
Рейтинг: 0 / 0
29.03.2019, 10:41
    #39793452
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в формировании запроса.
JossДля каждого покупателя выбрать по каждой группе наиболее покупаемый товар.
Что нужно вывести, если в группе есть два разных товара с одинаковым максимальным количеством. Оба товара? Один (какой)?
...
Рейтинг: 0 / 0
29.03.2019, 11:08
    #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
29.03.2019, 11:13
    #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
29.03.2019, 12:01
    #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
29.03.2019, 13:02
    #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
29.03.2019, 13:03
    #39793540
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в формировании запроса.
aleckoJoss,
процедура вычисляет минимальный период заказа, главное здесь показано как собрать в общий массив: массив заказчиков и массив заказов, учитывая что массив заказов у каждого заказчика свой-решение чисто экселевское

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


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