2012-11-23 26 views
5

बस एक इंटर्नशिप शुरू की और कुछ एसक्यूएल के साथ काम किया गया है। इसे कुछ हद तक मुश्किल ढूँढना। किसी भी मदद की सराहना करते हैं। धन्यवाद!एसक्यूएल; योग 2 फ़ील्ड और फिर उन्हें एक साथ जोड़ें

कार्य:।

"यह निम्नलिखित के लिए एक चेतावनी लिखने के लिए संभव है सभी ग्राहकों को जो जब खुला बिक्री अगले महीने में होने वाले आदेश खुला बिक्री चालान के साथ संयुक्त कर रहे हैं (जोड़ा) दिखाएँ, वे उनकी क्रेडिट सीमा से अधिक है। "

मेरे प्रस्तावित तर्क:

  1. सबसे पहले मुझे क्या करना चाहते हैं योग सभी बिक्री आदेश,, प्रत्येक ग्राहक के लिए है (बिक्री तालिका में) अगले महीने के भीतर।

  2. अगला, प्रत्येक ग्राहक के लिए सभी खुले चालान, यानी प्रत्येक ग्राहक के बकाया राशि (INVOICES तालिका में) की कुल राशि का काम करें।

  3. मैं तो है कि प्रत्येक ग्राहक के क्रेडिट सीमा से अपने अधिक से अधिक देखने के लिए एक साथ 1 और 2 के परिणामों को जोड़ने के लिए, इसी CUSTOMER_ID

  4. अगला ऊपर 3 से गणना की तुलना द्वारा चाहते हैं।

3 में अभिव्यक्त कुल क्रेडिट सीमा उसके बाद ही इन कंपनियों को उत्पन्न तालिका में प्रदर्शित किया जाना चाहिए से अधिक है। जिसके परिणामस्वरूप तालिका के लिए आदर्श प्रारूप होगा

Cust_ID|Name|Sum_sales_orders (1.above)|Sum_open_invoices (2.above)| Total_orders&invoices 
---------------------------------------------------------------------------- 
    1 | A | 25000     | 333      | 25333 
     | |       |       | 

कोड मेरे पास अब तक

SELECT arc.company, arc.credit_limit, 
    sum (ard.unit_price * ard.invoice_qty) as open_invoice_total, 
    sum (od.total_qty_ord * od.unit_price) as open_orders_total 
FROM iqms.arprepost_detail ard, iqms.arprepost arp, iqms.arcusto arc, iqms.ord_detail od, iqms.orders o 
WHERE ard.arprepost_id = arp.id 
    and arc.id = o.arcusto_id and o.id = od.orders_id 
    and arp.arcusto_id = arc.id 
    GROUP BY arc.company, arc.credit_limit 

मुझे लगता है कि यह() फ़ंक्शन राशि में सही योग की गणना है? या मैं गलत हूँ? मैं open_invoice_total और open_orders_total कैसे जोड़ सकता हूं? और फिर क्रेडिट_limit के खिलाफ उनकी तुलना करें?

मुझे आशा है कि आप लोग समझेंगे कि मैं क्या करने की कोशिश कर रहा हूं। अग्रिम में मदद के लिए धन्यवाद! :)

+1

'चुनें arc.company ....... समूह द्वारा चुनें ..... हैविंग योग (ard.unit_price * ard.invoice_qty) + योग (od.total_qty_ord * od.unit_price)> arc.credit_limit' –

उत्तर

3

आप HAVING क्लॉज का उपयोग यह जांचने के लिए कर सकते हैं कि कुल योग की राशि क्रेडिट सीमा से अधिक है या नहीं। मैंने पठनीयता के लिए, इनर जॉन्स के साथ WHERE खंड में शामिल होने को भी बदल दिया है।

SELECT arc.company, arc.credit_limit, 
     sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
     sum(od.total_qty_ord * od.unit_price) as open_orders_total 
FROM iqms.arprepost_detail ard 
     INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id 
     INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id 
     INNER JOIN iqms.ord_detail od ON o.id = od.orders_id 
     INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
    GROUP BY arc.company, arc.credit_limit 
    HAVING sum(ard.unit_price * ard.invoice_qty) + sum(od.total_qty_ord * od.unit_price) > arc.credit_limit; 

संपादित

बस स्पष्ट करने के लिए Dems टिप्पणी, GROUP BYaliases के विनिर्देश की अनुमति नहीं है, इसलिए ऊपर क्वेरी SELECT में और HAVING में 'दोहराता है' योग। इसे घोंसले से हटाया जा सकता है, हालांकि ध्यान दें कि HAVINGWHERE के साथ स्विच किया गया है। तो क्वेरी की एक ड्रायर संस्करण है: महान लोग यही

;WITH nested AS 
(
    SELECT arc.company, arc.credit_limit, 
      sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
      sum(od.total_qty_ord * od.unit_price) as open_orders_total 
    FROM iqms.arprepost_detail ard 
      INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id 
      INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id 
      INNER JOIN iqms.ord_detail od ON o.id = od.orders_id 
      INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
     GROUP BY arc.company, arc.credit_limit 
) 
SELECT company, credit_limit, open_invoice_total, open_orders_total 
    FROM nested 
    WHERE (open_invoice_total + open_orders_total) > arc.credit_limit; 
+2

+1: एक और विकल्प, जिसे मैं कुछ हद तक पसंद करता हूं * (जैसा कि यह स्वयं को सिद्धांत दोहराएं नहीं करता है) * क्वेरी को बाहरी क्वेरी 'से चुनें * चुनें * (Query) जहां से + b> c' 'ए' और' बी' के लिए गणना लिखने से बचने के लिए। * [कोई वास्तविक मापनीय प्रदर्शन अंतर भी नहीं है।] * – MatBailie

+0

@ डेम्स धन्यवाद - स्पष्ट। – StuartLC

0

:

SELECT company, credit_limit, open_invoice_total, open_orders_total 
FROM 
(
    SELECT arc.company, arc.credit_limit, 
      sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
      sum(od.total_qty_ord * od.unit_price) as open_orders_total 
    FROM iqms.arprepost_detail ard 
      INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id 
      INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id 
      INNER JOIN iqms.ord_detail od ON o.id = od.orders_id 
      INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
     GROUP BY arc.company, arc.credit_limit 
) AS nested 
WHERE (open_invoice_total + open_orders_total) > arc.credit_limit; 

और, यदि आप पसंद करते हैं, एक CTE इस अधिक पठनीय कर सकते हैं। हालांकि मेरे पास एक और सवाल है।

क्या मैं राशि फ़ील्ड को सशर्त रूप से जोड़ सकता हूं? उदाहरण के लिए, मैं केवल 'open_orders_total' को अगले महीने (sysdate + 31) के कारण होने वाले आदेशों से प्रभावित करना चाहता हूं। इसलिए यह कुछ ऑर्डर से गुज़रता है और यदि वे इस श्रेणी के बाहर हैं (due_date> sysdate + 31) तो उन्हें कुल रन में जोड़ना नहीं है। क्या इसे योग() फ़ंक्शन में कार्यान्वित किया जा सकता है?

ऐसा कुछ हो सकता है?

SELECT arc.company, arc.credit_limit, 
    SUM ((ard.unit_price*ard.invoice_qty) * CASE arp.due_date WHEN arp.due_date < sysdate+'31' and arp.due_date >= sysdate THEN 1 ELSE 0 END) as open_invoice_total, 

यह मेरे पहले बार में से एक है क्योंकि केस का उपयोग करके मैं माफी मांगता हूं। क्या ऐसा कुछ लागू किया जा सकता है?

मेरे दिमाग में एक एसयूएम जहां खंड तार्किक लगता है। ईजी:

Sum (quantity*price) WHERE due_date < (sysdate+31) 

सभी मदद के लिए धन्यवाद!

+0

: यदि आपके मन में कुछ है, तो आप इसे क्यों न करें, और देखें कि आप आउटपुट को अपेक्षित रूप से प्राप्त कर रहे हैं या नहीं। अगर आपको सही आउटपुट नहीं मिल रहा है, तो SO पर आएं, कोई भी आपकी मदद करेगा। –