Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie, aby znaleźć klienta z największą liczbą łącznych zakupów

Uważam, że poniższe zapytanie powinno zadziałać w celu zidentyfikowania nazwy klienta o najwyższej kwocie pochodzi ze wszystkich zamówień w bieżącym roku kalendarzowym:

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;

Najbardziej wewnętrzne zapytanie łączy tabele ORDER, ORDER_LINE i PRODUCT grupując według identyfikatora klienta, aby zsumować łączną liczbę zakupów w bieżącym roku (zamówienia według zsumowanej kwoty malejąco). Zapytanie o jeden poziom wyżej wykorzystuje wewnętrzne wyniki zapytania i dodaje maksymalną sumę zakupów. Najbardziej zewnętrzne zapytanie łączy tabelę CUSTOMER_T z wynikami wewnętrznymi, aby uzyskać nazwę klienta i łączną kwotę zamówienia dla wszystkich klientów, którzy odpowiadają wartości MAXAMT.

Możesz zmodyfikować warunek daty, aby zawsze ograniczać się do 2016 (niezależnie od bieżącego roku) w następujący sposób:

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

Napisz jako:

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

Możesz również ściągnąć zewnętrzne zapytanie CUSTOMER_T do wewnętrznej tabeli i dodać je do złączeń. Osiąga to samo, ale nie jestem pewien, który jest bardziej wydajny (co ma zastosowanie, jeśli zestaw danych jest duży).

Uwaga:napisane z perspektywy Oracle DB, miejmy nadzieję, że to pomoże i będziesz w stanie przekonwertować składnię.

Edycja:zdałem sobie sprawę, że moja sugestia przeoczyłaby wielu klientów o tej samej łącznej kwocie wydatków. Przerobiłem go, aby używać MAX i wyświetlać wielu klientów (jeśli dotyczy). Mam nadzieję, że to zadziała dla twojego/można przekonwertować na MYSQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ostrzeżenie:mysql_real_escape_string():Odmowa dostępu dla użytkownika ''@'localhost' (przy użyciu hasła:NIE)

  2. if(!isset($_SESSION['username'])) powodujący przekierowanie użytkowników z Verify_login_form.php z powrotem do index.php

  3. Tworzenie nowej kolumny z wierszami przesuniętymi w górę w MySql

  4. Wyszukiwanie podobnych wzorców liczbowych w tabeli

  5. Czy można użyć klauzuli WHERE do zaznaczenia wszystkich rekordów w instrukcji SQL?