Ritengo che la seguente query dovrebbe funzionare per identificare il nome del cliente con la importo più alto derivato da tutti gli ordini nell'anno solare corrente:
SELECT CUSTOMER_NAME, Y.QNTY
FROM CUSTOMER_T CUST,
(
SELECT X.CUSTOMER_ID, X.QNTY, MAX(X.QNTY) MAXAMT
FROM (
SELECT ORD.CUSTOMER_ID, SUM(OLN.QUANTITY * PRD.UNIT_PRICE) QNTY
FROM ORDER_T ORD, ORDER_LINE_T OLN, PRODUCT_T PRD
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
AND ORD.ORDER_ID = OLN.ORDER_ID
AND PRD.PRODUCT_ID = OLN.PRODUCT_ID
GROUP BY ORD.CUSTOMER_ID
) X
) Y
WHERE CUST.CUSTOMER_ID = Y.CUSTOMR_ID
AND Y.QNTY = Y.MAXAMT;
La query più interna unisce le tabelle ORDER, ORDER_LINE e PRODUCT raggruppate in base all'ID cliente per sommare gli acquisti totali per l'anno corrente (ordini per importo sommato decrescente). La query su un livello utilizza i risultati della query interna e aggiunge il totale massimo sommato degli acquisti. La query più esterna unisce la tabella CUSTOMER_T con i risultati interni per ottenere il nome del cliente e l'importo totale dell'ordine per tutti i clienti che corrispondono al valore MAXAMT.
Puoi modificare la condizione della data per limitarla sempre al 2016 (indipendentemente dall'anno in corso) come segue:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
Scrivi come:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')
Puoi anche estrarre la query esterna di CUSTOMER_T all'interno della tabella interna e aggiungerla ai join. Fa la stessa cosa, ma non sono sicuro di quale sia più efficiente (che è applicabile se il tuo set di dati è grande).
Nota:scritto da una prospettiva Oracle DB, si spera che questo aiuti e tu sia in grado di convertire la sintassi.
Modifica:mi sono reso conto che il mio suggerimento avrebbe trascurato più clienti con lo stesso importo di spesa totale. L'ho rielaborato per utilizzare MAX e mostrare più clienti (se applicabile). Spero che funzioni per il tuo/può essere convertito in MySQL.