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

Interrogazione per trovare il cliente con il maggior numero di acquisti totali

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.