Вярвам, че следната заявка трябва да работи, за да идентифицира името на клиента с най-високата сума получени от всички поръчки през текущата календарна година:
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;
Най-вътрешната заявка се присъединява към таблиците ORDER, ORDER_LINE и PRODUCT, групирани по ИД на клиента, за да сумира общите покупки за текущата година (поръчки по сумирана сума в низходящ ред). Заявката нагоре с едно ниво използва резултатите от вътрешната заявка и добавя максималния сумиран общ брой покупки. Най-външната заявка се присъединява към таблицата CUSTOMER_T с вътрешните резултати, за да получи името на клиента и общата сума на поръчката за всички клиенти, които отговарят на стойността MAXAMT.
Можете да промените условието за дата винаги да се ограничава до 2016 (независимо от текущата година), както следва:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
Напишете като:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')
Можете също така да изтеглите външната заявка на CUSTOMER_T във вътрешната таблица и да я добавите към съединенията. Постига същото, но не съм сигурен кое е по-ефективно (което е приложимо, ако вашият набор от данни е голям).
Забележка:Написано от гледна точка на Oracle DB, надяваме се това да помогне и можете да преобразувате синтаксиса.
Редактиране:Разбрах, че моето предложение ще пренебрегне множество клиенти с една и съща обща сума на разходите. Преработих го, за да използва MAX и да показва множество клиенти (ако е приложимо). Надяваме се, че това работи за вашия/може да се преобразува в MYSQL.