По сути, вы сообщаете результаты на уровне заказов , а не на уровне клиентов и заказов в соответствии с первоначальным вопросом. Ваш текущий набор результатов, вероятно, повторяет клиентов и детали заказа для каждого соответствующего элемента, что может быть длительным с его отношениями «один ко многим».
Чтобы решить эту проблему, просто реорганизуйте свой оператор SQL в агрегированный запрос, который группирует по элементам клиента и заказа и суммирует значение каждого элемента заказа для получения общей суммы всего заказа. Дополнительно учтите лучшие практики в SQL:
EXPLICIT JOIN: Как уже упоминалось в комментариях, не используйте запятую в старом стиле в предложении FROM
с соответствующими условиями в WHERE
. Это известно как неявные соединения. Текущий стандарт, введенный в ANSI-92, подчеркивает явные объединения с использованием предложений JOIN
и ON
. Хотя это не меняет эффективность или выход , оно способствует удобочитаемости и удобству обслуживания.
ВЫБЕРИТЕ КЛАВИШУ: Старайтесь избегать выбора всех полей в таблицах с Aorder.*, Acustomer.*
, который является выходным результатом открытого набора. Ваш вопрос специально задан для определенных полей: имя клиента, номер карты лояльности, дата заказа, и общая стоимость заказа . Итак, выберите их соответственно.
Псевдонимы таблиц. Для более длинных имен таблиц и таблиц, которые имеют одинаковые префиксы, основы или суффиксы, такие как таблицы A , используйте псевдонимы таблиц, которые правильно сокращают и определяют ваши идентификаторы. Опять же, эта практика не должна изменять производительность, но способствует удобочитаемости и удобству обслуживания.
См. Ниже рабочий оператор SQL (настройте имена полей в соответствии с действительными значениями).
SELECT c.customer_name,
c.loyalty_card_number,
CAST(o.orderDateTime AS DATE) AS Order_Date,
SUM(d.quantity * m.itemCost) AS Total_Order_Value
FROM Aorder o
INNER JOIN Acustomer c ON c.customerID = o.customerID
INNER JOIN AorderDetails d ON o.orderID = d.orderID
INNER JOIN AmenuItem m ON d.itemID = m.itemID
WHERE o.orderDateTime < Now()
AND o.orderDateTime > DATE_ADD(Now(), INTERVAL -6 MONTH)
AND o.paymentType IN ('Cash' , 'Card')
GROUP BY c.customer_name,
c.loyalty_card_number,
CAST(o.orderDateTime AS DATE)
ПРИМЕЧАНИЕ. Не допускайте ошибки, которую допускают многие пользователи MySQL, исключая неагрегированные столбцы в предложении GROUP BY
агрегированного запроса, который требуется в ANSI-SQL. Звездочки, *
, никогда не должны использоваться в совокупных запросах. К сожалению, MySQL разрешает эту функцию с отключенным режимом ONLY FULL GROUP BY
и может давать ненадежные результаты.