Я создаю оператор SQL, который будет возвращать сводные данные о продажах за месяц.
В сводке будут перечислены простые столбцы для даты, общего количества продаж и общей стоимости продаж.
Однако, в дополнение к этим столбцам, я хотел бы добавить еще 3, в которых будут перечислены месяцы, в которых лучший клиент потратил сумму. Для этих столбцов мне нужен встроенный подзапрос, который может вернуть их идентификатор, имя и сумму, которую они потратили.
В моих текущих усилиях используется встроенный оператор SELECT
, однако, насколько я знаю, как их реализовать, вы можете вернуть только один столбец и строку для каждого встроенного оператора.
Чтобы обойти это с моим сценарием, я, конечно, могу создать 3 отдельных встроенных оператора, однако, кроме того, что это кажется непрактичным, это увеличивает время запроса больше, чем необходимо.
SELECT
DATE_FORMAT(OrderDate,'%M %Y') AS OrderMonth,
COUNT(OrderID) AS TotalOrders,
SUM(OrderTotal) AS TotalAmount,
(SELECT SUM(OrderTotal) FROM Orders WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS TotalCustomerAmount,
(SELECT OrderCustomerFK FROM Orders WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS CustomerID,
(SELECT CustomerName FROM Orders INNER JOIN Customers ON OrderCustomerFK = CustomerID WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS CustomerName
FROM Orders
GROUP BY DATE_FORMAT(OrderDate,'%m%y')
ORDER BY DATE_FORMAT(OrderDate,'%y%m') DESC
Как мне лучше структурировать этот запрос?
ПОЛНЫЙ ОТВЕТ
После некоторой настройки решения Дейва Баркерса у меня есть окончательная версия для тех, кто в будущем ищет помощи.
Решение Дейва Баркера отлично сработало с данными клиентов, однако благодаря этому столбцы «Общая сумма продаж» и «Общая сумма продаж» получили несколько сумасшедших цифр.
SELECT
Y.OrderMonth, Y.TotalOrders, Y.TotalAmount,
Z.OrdCustFK, Z.CustCompany, Z.CustOrdTotal, Z.CustSalesTotal
FROM
(SELECT
OrdDate,
DATE_FORMAT(OrdDate,'%M %Y') AS OrderMonth,
COUNT(OrderID) AS TotalOrders,
SUM(OrdGrandTotal) AS TotalAmount
FROM Orders
WHERE OrdConfirmed = 1
GROUP BY DATE_FORMAT(OrdDate,'%m%y')
ORDER BY DATE_FORMAT(OrdDate,'%Y%m') DESC)
Y INNER JOIN
(SELECT
DATE_FORMAT(OrdDate,'%M %Y') AS CustMonth,
OrdCustFK,
CustCompany,
COUNT(OrderID) AS CustOrdTotal,
SUM(OrdGrandTotal) AS CustSalesTotal
FROM Orders INNER JOIN CustomerDetails ON OrdCustFK = CustomerID
WHERE OrdConfirmed = 1
GROUP BY DATE_FORMAT(OrdDate,'%m%y'), OrdCustFK
ORDER BY SUM(OrdGrandTotal) DESC)
Z ON Z.CustMonth = Y.OrderMonth
GROUP BY DATE_FORMAT(OrdDate,'%Y%m')
ORDER BY DATE_FORMAT(OrdDate,'%Y%m') DESC