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 ANTWORT

Nach 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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage