Ich erstelle eine SQL-Anweisung, die eine monatliche Zusammenfassung der Verkäufe liefert.
Die Zusammenfassung enthält einige einfache Spalten für das Datum, die Gesamtzahl der Verkäufe und den Gesamtwert der Verkäufe.
Zusätzlich zu diesen Spalten möchte ich jedoch noch 3 weitere einfügen, die die besten Kunden des Monats nach dem ausgegebenen Betrag auflisten. Für diese Spalten benötige ich eine Art Inline-Subquery, die ihre ID, ihren Namen und den Betrag, den sie ausgegeben haben, zurückgeben kann.
Mein derzeitiger Versuch verwendet eine Inline SELECT
Anweisung, aber meines Wissens nach können Sie nur eine Spalte und eine Zeile pro Inline-Anweisung zurückgeben.
Um dies mit meinem Szenario zu umgehen, kann ich natürlich 3 separate Inline-Anweisungen erstellen, aber abgesehen davon, dass dies unpraktisch erscheint, erhöht es die Abfragezeit mehr als nötig.
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
Wie kann ich diese Abfrage besser strukturieren?
VOLLSTÄNDIGE ANTWORT
Nach einigen Änderungen an Dave Barkers Lösung habe ich nun eine endgültige Version für alle, die in Zukunft Hilfe suchen.
Die Lösung von Dave Barker funktionierte perfekt mit den Kundendetails, führte jedoch dazu, dass die einfacheren Spalten "Gesamtumsatz" und "Gesamtumsatz" einige verrückte Zahlen erhielten.
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