SQL-запрос: отображение нескольких данных и общего значения заказа - PullRequest
0 голосов
/ 31 мая 2019

В рамках назначения SQL-запросов я должен соответствовать следующим критериям:

"Показать всех клиентов, которые купили что-либо за последние 6 месяцев. Показать> имя клиента, номер карты лояльности, дату заказа и общую стоимость заказа.> Убедитесь, что в результатах запроса это имя правильно указано как Total_Order_Value."

Для этого я придумал скрипт, который был помечен как неправильный. Меня смущает обратная связь, так как я считаю, что соответствует критериям вопроса. Найдите скрипт и отзывы ниже:

Сценарий

SELECT Aorder.*, Acustomer.*, AorderDetails.quantity, (AorderDetails.quantity *AmenuItem.itemCost) AS Total_Order_Value 
FROM Aorder, Acustomer, AmenuItem, AorderDetails
WHERE orderDateTime < Now() AND orderDateTime > DATE_ADD(Now(), INTERVAL -6 MONTH)
AND Acustomer.customerID = Aorder.customerID 
AND Aorder.orderID = AorderDetails.orderID
AND AorderDetails.itemID = AmenuItem.itemID
AND Aorder.paymentType IN ('Cash' , 'Card');

Обратная связь

"В данный момент это будет умножаться на стоимость * кол-во для каждого отдельного предмета, купленного в одном заказе. Вам нужна общая стоимость для каждого заказа. Т.е. на данный момент я вижу стоимость для каждого предмета, который я купил в одном заказе, я хотел бы видеть итоговую сумму за весь заказ. Вам нужно добавить агрегат и группу с помощью "

Буду признателен за любую помощь, чтобы помочь мне понять, что пошло не так, и как я могу правильно структурировать это в соответствии с требованиями. Заранее спасибо.

1 Ответ

0 голосов
/ 31 мая 2019

По сути, вы сообщаете результаты на уровне заказов , а не на уровне клиентов и заказов в соответствии с первоначальным вопросом. Ваш текущий набор результатов, вероятно, повторяет клиентов и детали заказа для каждого соответствующего элемента, что может быть длительным с его отношениями «один ко многим».

Чтобы решить эту проблему, просто реорганизуйте свой оператор SQL в агрегированный запрос, который группирует по элементам клиента и заказа и суммирует значение каждого элемента заказа для получения общей суммы всего заказа. Дополнительно учтите лучшие практики в SQL:

  1. EXPLICIT JOIN: Как уже упоминалось в комментариях, не используйте запятую в старом стиле в предложении FROM с соответствующими условиями в WHERE. Это известно как неявные соединения. Текущий стандарт, введенный в ANSI-92, подчеркивает явные объединения с использованием предложений JOIN и ON. Хотя это не меняет эффективность или выход , оно способствует удобочитаемости и удобству обслуживания.

  2. ВЫБЕРИТЕ КЛАВИШУ: Старайтесь избегать выбора всех полей в таблицах с Aorder.*, Acustomer.*, который является выходным результатом открытого набора. Ваш вопрос специально задан для определенных полей: имя клиента, номер карты лояльности, дата заказа, и общая стоимость заказа . Итак, выберите их соответственно.

  3. Псевдонимы таблиц. Для более длинных имен таблиц и таблиц, которые имеют одинаковые префиксы, основы или суффиксы, такие как таблицы 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 и может давать ненадежные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...