У меня есть база данных для отслеживания покупок наград для наших клиентов. Наши клиенты приходят, делают покупки, и мы регистрируем их в этой базе данных вознаграждений. Когда клиент отвечает требованиям (см. Ниже) для «выдачи» вознаграждений, база данных «выдаст» вознаграждения клиенту. В следующий раз, когда клиент совершит покупку, мы увидим вознаграждения в размере XX.XX в нашей базе данных и применим эту скидку к их покупке.
Самая большая проблема, с которой я борюсь, - это способ выполнения sh, который 1) не замедляет работу базы данных, и 2) может выполняться в фоновом режиме, когда работает пользователь db. .
В настоящее время предъявляются следующие требования:
- Шесть покупок в течение календарного года.
- Шесть покупок должны совершаться в РАЗНЫЕ даты , Покупки, которые происходят в тот же день, подсчитываются как часть той же покупки
- Эти требования (6 покупок за 6 посещений) сохраняются как опции в
tblOptions
I'm пытаясь собрать процедуру (функцию, которую я мог бы вызывать на протяжении всей БД, чтобы выполнять здесь «математику» каждый раз, когда пользователь выполняет задачу), чтобы проверить, есть ли покупки n
с начала календарного года (на основе NumVisits
& NumPurchases
в tblOptions
) ИЛИ с момента последнего получения вознаграждения (эта дата в qryLastRewardIssuedDate
) с tbPurchases
(да, я пропустил «l» в случае аварии - я буду исправить это позже).
Цели:
- Получить, сколько покупок было сделано с
qryLastRewardIssued.IssueDate
- Убедитесь, что они были сделаны на в отдельные дни и в текущем календарном году
- ЕСЛИ вышеуказанные требования были выполнены, то рассчитайте процентную долю от их общего объема покупок на основе значения параметра
tblOptions.PerDiscount
Вот мои отношения:
* 104 5 *
ИСТОРИЯ:
Это началось с того, что я попытался создать простой запрос для определения количества покупок. Я хотел попытаться выполнить это sh, используя запросы, но, подумав, решил, что может быть эффективнее создать процедуру, которую я могу вызывать каждый раз, когда пользователь выполняет действие. Мои запросы, к сожалению, не сработали для меня, и я боролся со всем этим процессом. Я действительно неравнодушен к Access (как видно из моей истории переполнения стека), и я, честно говоря, не так уж хорош с ним для начала. Я имел опыт работы с Access и в прошлом проектировал несколько баз данных, но все они были простыми базами данных «вставь данные, проверь данные позже». На самом деле эта процедура должна обрабатывать математические процедуры на регулярной основе, так как она используется.
Так как это началось с запроса, чтобы просто узнать количество покупок, вот оператор SQL, который я использовал (который не выдает ошибку, но всегда возвращает никаких результатов):
SELECT Count(tbPurchases.MemberID) AS CountOfMemberID, Count(tbPurchases.PurchaseDate) AS NumOfPurchases
FROM tbPurchases INNER JOIN qryLastRewardIssuedDate ON tbPurchases.MemberID = qryLastRewardIssuedDate.CustomerID
HAVING (((Count(tbPurchases.PurchaseDate)) Between [qryLastRewardIssuedDate]![IssueDate] And Now()));
А вот SQL для моего запроса qryLastRewardIssuedDate
:
SELECT tblRewards.CustomerID, Last(tblRewards.IssueDate) AS LastOfIssueDate
FROM tblRewards
GROUP BY tblRewards.CustomerID;
Я знаю здесь не так уж много для go, и я прошу прощения за это. У меня еще не было прозрений, которые могли бы привести меня в правильном направлении. Я надеюсь, что вы все можете помочь мне с этим. Спасибо!
РЕДАКТИРОВАТЬ: Немного поиграв с вашим утверждением SQL (и исправив псевдонимы, упомянутые в комментарии), вот что я собираюсь сделать:
SELECT q.MemberID, Max(q.PurchaseDate) AS MaxOfPurchaseDate
FROM (SELECT p.MemberID, p.PurchaseDate FROM tbPurchases p WHERE p.PurchaseDate >= Dateserial(2012,1,1)
AND p.PurchaseDate > (SELECT Max(r.IssueDate) FROM tblRewards r WHERE r.CustomerID = p.MemberID)) AS q
GROUP BY q.MemberID
HAVING (((Count(*))>=(SELECT Last(o.NumPurchases) AS LastOfNumPurchases FROM tblOptions o)));
Также учитывается переменное количество покупок. У меня проблема с выводом правильной стоимости покупки (tbPurchases.PurchaseAmount
). Я получаю тот же результат по запросу, когда использую SQL:
SELECT q.MemberID, Max(q.PurchaseDate) AS MaxOfPurchaseDate, Last(tbPurchases.PurchaseAmount) AS LastOfPurchaseAmount
FROM (SELECT p.MemberID, p.PurchaseDate FROM tbPurchases AS p WHERE p.PurchaseDate >= Dateserial(2012,1,1) AND p.PurchaseDate > (SELECT Max(r.IssueDate) FROM tblRewards r WHERE r.CustomerID = p.MemberID)) AS q, tbPurchases
GROUP BY q.MemberID
HAVING (((Count(*))>=(SELECT Last(o.NumPurchases) AS LastOfNumPurchases FROM tblOptions o)));
Что, я полагаю, может быть проблемой JOIN или, возможно, фактом, что мне нужно псевдоним tbPurchases.PurchaseAmount
? Я не совсем уверен.
Кроме того, я не совсем уверен, как проверить, что покупки были сделаны в отдельные дни прямо сейчас. Любые идеи?
РЕДАКТИРОВАТЬ 2 - Пример данных:
tblMembers
:
╔════╦════════════╦═══════════╗
║ ID ║ First Name ║ Last Name ║
╠════╬════════════╬═══════════╣
║ 1 ║ Jason ║ Something ║
║ 2 ║ Jimmy ║ Carter ║
║ 3 ║ Ronald ║ Reagan ║
║ 4 ║ Ronald ║ McDonald ║
╚════╩════════════╩═══════════╝
tblOptions
:
╔════╦═══════════╦══════════════╦═════════════╗
║ ID ║ NumVisits ║ NumPurchases ║ PerDiscount ║
╠════╬═══════════╬══════════════╬═════════════╣
║ 1 ║ 6 ║ 6 ║ 10.00% ║
╚════╩═══════════╩══════════════╩═════════════╝
tblRewards
:
╔════╦════════════╦════════════╦═════════════╦
║ ID ║ CustomerID ║ IssueDate ║ IssueAmount ║
╠════╬════════════╬════════════╬═════════════╬
║ 1 ║ 24544 ║ 7/22/2011 ║ $100.00 ║
║ 2 ║ 24557 ║ 6/27/2018 ║ $100.00 ║
║ 3 ║ 25012 ║ 11/23/2019 ║ $46.63 ║
║ 4 ║ 28227 ║ 11/11/2019 ║ $40.35 ║
╚════╩════════════╩════════════╩═════════════╩
tbPurchases
:
╔════╦══════════╦══════════════╦════════════════╗
║ ID ║ MemberID ║ PurchaseDate ║ PurchaseAmount ║
╠════╬══════════╬══════════════╬════════════════╣
║ 1 ║ 29792 ║ 2/25/2013 ║ $37.99 ║
║ 2 ║ 24586 ║ 1/3/2019 ║ $114.99 ║
║ 3 ║ 26505 ║ 1/3/2019 ║ $7.96 ║
╚════╩══════════╩══════════════╩════════════════╝
ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ: Идея здесь состоит в том, чтобы проверить базу данных для клиентов, которые совершили n
покупок (с tblOptions.NumPurchases
- в настоящее время 6) в текущем календарном году. Данных в базе данных не много, но я добавил несколько покупок только для того, чтобы проверить их для этой цели.
Если в текущем календарном году было правильное количество покупок, то он вычислит общую сумму, потраченную клиентом на эти n
покупки, и, используя tblOptions.PerDiscount
, рассчитает сумму "вознаграждений", на которые клиент имеет право при следующем посещении.
Затем наступает время, когда процедура Я хотел бы попытаться создать функцию, которая может выполнять sh эти вычисления по всей базе данных. Добавление его к другим действиям, таким как добавление новых клиентов или ввод покупки текущим клиентом. И, самое главное, когда база данных открывается и закрывается. Все это легко выполняется sh путем создания процедуры, которую я могу вызывать повторно. Но мне трудно заставить эти SQL запросы сотрудничать.