Saya yakin kueri berikut akan berfungsi untuk mengidentifikasi nama pelanggan dengan jumlah tertinggi berasal dari semua pesanan di tahun kalender saat ini:
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;
Kueri paling dalam bergabung dengan tabel ORDER, ORDER_LINE, dan PRODUCT yang dikelompokkan menurut ID pelanggan untuk menjumlahkan total pembelian untuk tahun berjalan (pesanan berdasarkan jumlah jumlah menurun). Kueri naik satu tingkat menggunakan hasil kueri dalam dan menambahkan jumlah total pembelian maksimum. Kueri terluar bergabung dengan tabel CUSTOMER_T dengan hasil dalam untuk mendapatkan Nama pelanggan dan jumlah total pesanan untuk semua pelanggan yang cocok dengan nilai MAXAMT.
Anda dapat mengubah kondisi tanggal untuk selalu membatasi hingga 2016 (terlepas dari tahun berjalan) sebagai berikut:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(SYSDATE,'YEAR')
Tulis sebagai:
WHERE TRUNC(OLN.ORDER_DATE,'YEAR') = TRUNC(TO_DATE('01/01/2016','MM/DD/YYYY'),'YEAR')
Anda juga dapat menarik kueri luar CUSTOMER_T di dalam tabel dalam dan menambahkannya ke gabungan. Ini menyelesaikan hal yang sama, tetapi saya tidak yakin mana yang lebih efisien (yang berlaku jika kumpulan data Anda besar).
Catatan:Ditulis dari perspektif Oracle DB, semoga ini membantu dan Anda dapat mengonversi sintaks.
Sunting:Saya menyadari saran saya akan mengabaikan banyak pelanggan dengan jumlah total pengeluaran yang sama. Saya telah mengerjakan ulang untuk menggunakan MAX dan menunjukkan banyak pelanggan (jika ada). Semoga ini berhasil untuk Anda/dapat dikonversi ke MYSQL.