Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrage, um den Kunden mit den höchsten Gesamteinkäufen zu finden

Ich glaube, die folgende Abfrage sollte funktionieren, um den Kundennamen mit dem höchsten Betrag zu identifizieren abgeleitet aus allen Bestellungen des laufenden Kalenderjahres:

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;

Die innerste Abfrage verbindet die Tabellen ORDER, ORDER_LINE und PRODUCT gruppiert nach der Kunden-ID, um die Gesamteinkäufe für das laufende Jahr zu summieren (Bestellungen nach absteigender Summe). Die Abfrage eine Ebene höher verwendet die inneren Abfrageergebnisse und addiert die maximale Gesamtsumme der Einkäufe hinzu. Die äußerste Abfrage verknüpft die Tabelle CUSTOMER_T mit den inneren Ergebnissen, um den Kundennamen und die Gesamtbestellmenge für alle Kunden zu erhalten, die mit dem MAXAMT-Wert übereinstimmen.

Sie können die Datumsbedingung so ändern, dass sie immer auf 2016 beschränkt ist (unabhängig vom aktuellen Jahr):

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

Schreiben Sie als:

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

Sie können auch die äußere Abfrage von CUSTOMER_T in die innere Tabelle ziehen und sie den Joins hinzufügen. Es erreicht dasselbe, aber ich bin mir nicht sicher, was effizienter ist (was anwendbar ist, wenn Ihr Datensatz groß ist).

Hinweis:Geschrieben aus einer Oracle DB-Perspektive, hoffentlich hilft dies und Sie können die Syntax konvertieren.

Bearbeiten:Mir wurde klar, dass mein Vorschlag mehrere Kunden mit demselben Gesamtausgabenbetrag übersehen würde. Ich habe es überarbeitet, um MAX zu verwenden und mehrere Kunden anzuzeigen (falls zutreffend). Ich hoffe, das funktioniert bei Ihnen/kann in MYSQL konvertiert werden.