MySQL: Mehrere Spalten aus einer Inline-Unterabfrage zurückgeben
Ich erstelle eine SQL-Anweisung, die eine monatliche Zusammenfassung der Verkäufe zurückgibt.
In der Zusammenfassung werden einige einfache Spalten für das Datum, die Gesamtanzahl der Verkäufe und den Gesamtwert der Verkäufe aufgeführt.
Zusätzlich zu diesen Spalten möchte ich jedoch noch drei weitere hinzufügen, in denen die monatelang besten Kunden nach ausgegebenem Betrag aufgelistet sind. Für diese Spalten benötige ich eine Art Inline-Unterabfrage, die ihre ID, ihren Namen und den von ihnen ausgegebenen Betrag zurückgeben kann.
Meine aktuellen Bemühungen nutzen eine InlineSELECT
Meines Wissens über die Implementierung dieser Anweisungen können Sie jedoch nur eine Spalte und eine Zeile pro Inline-Anweisung zurückgeben.
Um dieses Problem in meinem Szenario zu umgehen, kann ich natürlich 3 separate Inline-Anweisungen erstellen. Abgesehen davon, dass dies unpraktisch erscheint, verlängert sich die Abfragezeit jedoch um ein Vielfaches.
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 ANTWORTNach einigen Optimierungen der Dave Barkers-Lösung habe ich eine endgültige Version für alle, die in Zukunft Hilfe suchen.
Die Lösung von Dave Barker passte perfekt zu den Kundendaten. Die einfacheren Spalten "Total Sales" und "Total Sale Amount" erhielten jedoch einige verrückte Zahlen.
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