sql >> Database >  >> RDS >> Mysql

Vraag om de klant te vinden met het hoogste aantal totale aankopen

Ik denk dat de volgende zoekopdracht zou moeten werken om de naam van de klant te identificeren met het hoogste bedrag afgeleid van alle bestellingen in het lopende kalenderjaar:

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;

De binnenste zoekopdracht voegt de ORDER-, ORDER_LINE- en PRODUCT-tabellen samen, gegroepeerd op klant-ID om de totale aankopen voor het lopende jaar op te tellen (bestellingen op opgeteld bedrag aflopend). De zoekopdracht één niveau hoger gebruikt de resultaten van de innerlijke zoekopdracht en telt op bij het maximale totaal van aankopen. De buitenste zoekopdracht voegt zich bij de CUSTOMER_T-tabel met de binnenste resultaten om de naam van de klant en het totale bestelbedrag te krijgen voor alle klanten die overeenkomen met de MAXAMT-waarde.

U kunt de datumvoorwaarde als volgt wijzigen om altijd te beperken tot 2016 (ongeacht het huidige jaar):

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

Schrijf als:

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

U kunt ook de buitenste query van CUSTOMER_T in de binnentabel trekken en deze aan de joins toevoegen. Het bereikt hetzelfde, maar ik weet niet zeker wat efficiënter is (wat van toepassing is als uw dataset groot is).

Opmerking:Geschreven vanuit een Oracle DB-perspectief, hopelijk helpt dit en bent u in staat om de syntaxis te converteren.

Bewerken:ik realiseerde me dat mijn suggestie meerdere klanten met hetzelfde totale bestedingsbedrag over het hoofd zou zien. Ik heb het herwerkt om MAX te gebruiken en meerdere klanten te tonen (indien van toepassing). Ik hoop dat dit voor u werkt/kan worden geconverteerd naar MYSQL.



  1. Gematerialiseerde weergave creëren die elke 5 minuten wordt vernieuwd

  2. volgnullen gaan niet in de database

  3. Software Review - Stellar Reparatie voor MS SQL

  4. Sorteer op kolom ASC, maar eerst NULL-waarden?