sql >> Databasteknik >  >> RDS >> Mysql

Fråga för att hitta den kund som har det högsta antalet totala köp

Jag tror att följande fråga borde fungera för att identifiera kundnamnet med det högsta beloppet härledd från alla beställningar under innevarande 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 innersta frågan ansluter sig till tabellerna ORDER, ORDER_LINE och PRODUCT grupperade efter kund-ID för att summera de totala inköpen för innevarande år (beställningar efter summerat belopp fallande). Frågan upp en nivå använder de inre frågeresultaten och lägger till den maximala summan av inköp. Den yttersta frågan förenar CUSTOMER_T-tabellen med de inre resultaten för att få kundens namn och totala orderbelopp för alla kunder som matchar MAXAMT-värdet.

Du kan ändra datumvillkoret för att alltid begränsa till 2016 (oavsett innevarande år) enligt följande:

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 också dra den yttre frågan för CUSTOMER_T inuti den inre tabellen och lägga till den i kopplingarna. Det åstadkommer samma sak, men jag är inte säker på vilket som är mer effektivt (vilket är tillämpligt om din datamängd är stor).

Obs:Skrivet ur ett Oracle DB-perspektiv, förhoppningsvis hjälper detta och du kan konvertera syntaxen.

Edit:Jag insåg att mitt förslag skulle förbise flera kunder med samma totala utgiftsbelopp. Jag har omarbetat den för att använda MAX och visa flera kunder (om tillämpligt). Hoppas detta fungerar för din/kan konverteras till MYSQL.



  1. få senaste textinmatningen av GROUP BY-satsen

  2. pymysql fetchall() resultat som ordbok?

  3. SQL - Hur man väljer en rad med en kolumn med maxvärde i Oracle

  4. 40 frågor du måste veta om R12.2