Jeg mener, at følgende forespørgsel burde fungere for at identificere kundenavnet med det højeste beløb afledt af alle ordrer i det aktuelle kalenderår:
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;
Den inderste forespørgsel forbinder ORDER-, ORDER_LINE- og PRODUCT-tabellerne efter kunde-id'et for at opsummere det samlede køb for det aktuelle år (ordrer efter det samlede beløb faldende). Forespørgslen et niveau op bruger de indre forespørgselsresultater og tilføjer det maksimale samlede antal køb. Den yderste forespørgsel forbinder CUSTOMER_T-tabellen med de indre resultater for at få kundenavnet og det samlede ordrebeløb for alle kunder, der matcher MAXAMT-værdien.
Du kan ændre datobetingelsen til altid at begrænse til 2016 (uanset indeværende år) som følger:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
Skriv som:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')
Du kan også trække den ydre forespørgsel fra CUSTOMER_T inde i den indre tabel og tilføje den til joins. Det opnår det samme, men jeg er ikke sikker på, hvad der er mere effektivt (hvilket er relevant, hvis dit datasæt er stort).
Bemærk:Skrevet fra et Oracle DB-perspektiv, forhåbentlig hjælper dette, og du er i stand til at konvertere syntaksen.
Edit:Jeg indså, at mit forslag ville overse flere kunder med det samme samlede forbrugsbeløb. Jeg har omarbejdet det til at bruge MAX og vise flere kunder (hvis relevant). Håber dette virker for din/kan konverteres til MYSQL.