Tôi tin rằng truy vấn sau sẽ hoạt động để xác định tên khách hàng có số tiền cao nhất bắt nguồn từ tất cả các đơn đặt hàng trong năm dương lịch hiện tại:
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;
Truy vấn bên trong nhất kết hợp các bảng ORDER, ORDER_LINE và PRODUCT nhóm theo ID khách hàng để tính tổng số lần mua hàng cho năm hiện tại (đơn hàng theo tổng số tiền giảm dần). Truy vấn lên một cấp sử dụng kết quả truy vấn bên trong và thêm vào tổng số lần mua hàng được tính tổng tối đa. Truy vấn ngoài cùng nhất kết hợp bảng CUSTOMER_T với kết quả bên trong để lấy Tên khách hàng và tổng số tiền đặt hàng cho tất cả khách hàng phù hợp với giá trị MAXAMT.
Bạn có thể sửa đổi điều kiện ngày để luôn giới hạn đến năm 2016 (bất kể năm hiện tại) như sau:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
Viết là:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')
Bạn cũng có thể kéo truy vấn bên ngoài CUSTOMER_T vào bên trong bảng bên trong và thêm nó vào các phép nối. Nó hoàn thành điều tương tự, nhưng tôi không chắc cái nào hiệu quả hơn (có thể áp dụng nếu tập dữ liệu của bạn lớn).
Lưu ý:Được viết từ góc độ Oracle DB, hy vọng điều này sẽ hữu ích và bạn có thể chuyển đổi cú pháp.
Chỉnh sửa:Tôi nhận ra rằng đề xuất của mình sẽ bỏ qua nhiều khách hàng có cùng tổng số tiền chi tiêu. Tôi đã làm lại nó để sử dụng MAX và hiển thị cho nhiều khách hàng (nếu có). Hy vọng điều này hoạt động cho của bạn / có thể được chuyển đổi thành MYSQL.