Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête pour trouver le client avec le montant total des achats le plus élevé

Je pense que la requête suivante devrait fonctionner pour identifier le nom du client avec le montant le plus élevé dérivé de toutes les commandes de l'année civile en cours :

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 requête la plus interne joint les tables ORDER, ORDER_LINE et PRODUCT regroupées par ID client pour additionner le total des achats pour l'année en cours (commandes par montant total décroissant). La requête d'un niveau supérieur utilise les résultats de la requête interne et ajoute le total maximal des achats. La requête la plus externe joint la table CUSTOMER_T avec les résultats internes pour obtenir le nom du client et le montant total de la commande pour tous les clients qui correspondent à la valeur MAXAMT.

Vous pouvez modifier la condition de date pour toujours restreindre à 2016 (quelle que soit l'année en cours) comme suit :

WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')

Écrivez comme :

WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')

Vous pouvez également extraire la requête externe de CUSTOMER_T à l'intérieur de la table interne et l'ajouter aux jointures. Il accomplit la même chose, mais je ne sais pas lequel est le plus efficace (ce qui s'applique si votre ensemble de données est volumineux).

Remarque :Écrit du point de vue d'une base de données Oracle, nous espérons que cela vous aidera et que vous serez en mesure de convertir la syntaxe.

Edit :J'ai réalisé que ma suggestion négligerait plusieurs clients avec le même montant total de dépenses. Je l'ai retravaillé pour utiliser MAX et afficher plusieurs clients (le cas échéant). J'espère que cela fonctionne pour votre / peut être converti en MYSQL.