sql >> Database teknologi >  >> RDS >> Mysql

Forespørgsel for at finde kunden med det højeste antal samlede køb

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.



  1. 4 PL/SQL anonyme blokeksempler

  2. PostgreSQL initdb (Database Initialization) på Linux

  3. PHP/MySQL Like-knap

  4. Sådan administrerer du din database med Adminer