MySQL: Devolviendo múltiples columnas desde una subconsulta en línea

Estoy creando una declaración SQL que devolverá un resumen mensual de las ventas.

El resumen enumerará algunas columnas simples para la fecha, el número total de ventas y el valor total de las ventas.

Sin embargo, además de estas columnas, me gustaría incluir 3 más que enumerarán los mejores clientes del mes por cantidad gastada. Para estas columnas, necesito algún tipo de subconsulta en línea que pueda devolver su ID, nombre y la cantidad que gastaron.

Mi esfuerzo actual utiliza un inlineSELECT Sin embargo, según mi conocimiento sobre cómo implementarlos, solo puede devolver una columna y una fila por cada declaración en línea.

Para solucionar esto con mi escenario, por supuesto puedo crear 3 declaraciones en línea separadas, sin embargo, además de que parece poco práctico, aumenta el tiempo de consulta más de lo necesario.

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

¿Cómo puedo estructurar mejor esta consulta?

RESPUESTA COMPLETA

Después de algunos ajustes en la solución de Dave Barkers, tengo una versión final para cualquier persona en el futuro que busque ayuda.

La solución de Dave Barker funcionó a la perfección con los detalles del cliente, sin embargo, hizo que las columnas de Ventas totales y Cantidad de ventas totales más simples obtuvieran algunas cifras locas.

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta