मेरा मानना है कि निम्न क्वेरी को उच्चतम राशि के साथ ग्राहक नाम की पहचान करने के लिए काम करना चाहिए वर्तमान कैलेंडर वर्ष में सभी आदेशों से प्राप्त:
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 तालिकाओं को जोड़ती है ताकि चालू वर्ष के लिए कुल खरीदारियों का योग हो (क्रमशः राशि के अवरोही क्रम में)। एक स्तर तक की क्वेरी आंतरिक क्वेरी परिणामों का उपयोग करती है और खरीदारी के अधिकतम योग को जोड़ती है। MAXAMT मान से मेल खाने वाले सभी ग्राहकों के लिए ग्राहक का नाम और कुल ऑर्डर राशि प्राप्त करने के लिए सबसे बाहरी क्वेरी आंतरिक परिणामों के साथ CUSTOMER_T तालिका में शामिल हो जाती है।
आप दिनांक की शर्त को हमेशा 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 की बाहरी क्वेरी को आंतरिक तालिका के अंदर भी खींच सकते हैं और इसे जॉइन में जोड़ सकते हैं। यह वही काम पूरा करता है, लेकिन मुझे यकीन नहीं है कि कौन सा अधिक कुशल है (जो आपके डेटा सेट के बड़े होने पर लागू होता है)।
नोट:ओरेकल डीबी परिप्रेक्ष्य से लिखा गया है, उम्मीद है कि यह मदद करता है और आप सिंटैक्स को बदलने में सक्षम हैं।
संपादित करें:मुझे एहसास हुआ कि मेरा सुझाव एक ही कुल खर्च राशि वाले कई ग्राहकों की अनदेखी करेगा। मैंने इसे MAX का उपयोग करने और कई ग्राहकों को दिखाने के लिए फिर से काम किया है (यदि लागू हो)। आशा है कि यह आपके लिए काम करेगा/इसे MYSQL में बदला जा सकता है।