sql >> Databáze >  >> RDS >> Mysql

Dotaz k nalezení zákazníka s nejvyšším počtem celkových nákupů

Domnívám se, že následující dotaz by měl fungovat k identifikaci jména zákazníka s nejvyšší částkou odvozené ze všech objednávek v aktuálním kalendářním roce:

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;

Nejvnitřnější dotaz spojuje seskupení tabulek ORDER, ORDER_LINE a PRODUCT podle ID zákazníka, aby se sečetly celkové nákupy za aktuální rok (objednávky podle součtu sestupně). Dotaz o jednu úroveň výše používá výsledky vnitřního dotazu a přidává k maximálnímu součtu nákupů. Nejvzdálenější dotaz spojí tabulku CUSTOMER_T s vnitřními výsledky a získá jméno zákazníka a celkovou částku objednávky pro všechny zákazníky, kteří odpovídají hodnotě MAXAMT.

Podmínku data můžete upravit tak, aby byla vždy omezena na rok 2016 (bez ohledu na aktuální rok) takto:

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

Napište jako:

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

Můžete také stáhnout vnější dotaz CUSTOMER_T do vnitřní tabulky a přidat jej do spojení. Dosahuje stejné věci, ale nejsem si jistý, co je efektivnější (což platí, pokud je váš soubor dat velký).

Poznámka:Psáno z pohledu Oracle DB, doufejme, že to pomůže a budete schopni převést syntaxi.

Edit:Uvědomil jsem si, že můj návrh přehlédne více zákazníků se stejnou celkovou částkou útraty. Přepracoval jsem to tak, aby používal MAX a zobrazoval více zákazníkům (pokud je to možné). Doufám, že to pro vás funguje/lze převést na MYSQL.



  1. PHP/MySQL lepší uživatelské vyhledávání

  2. Entity Framework generuje short místo int

  3. Přeskočte mezeru SQL přes konkrétní podmínky a správné použití lead().

  4. Proč by tento dotaz MySQL pomocí rand() ve třetině případů nevracel žádné výsledky?