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.