2009-09-07 17 views
11

मैं 2 अलग-अलग तालिकाओं से कई स्तंभों का योग प्राप्त करना चाहता हूं (ये तालिकाएं समान संरचना साझा करती हैं)।दो टेबलों से कई कॉलमों का योग प्राप्त करना

अगर मैं केवल एक ही मेज पर विचार, मैं क्वेरी इस तरह लिखना होगा:,

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
    FROM T_FOO 
    WHERE seller = XXX 
    GROUP BY MONTH_REF; 

हालांकि मैं भी तालिका T_BAR से डेटा के साथ काम करना चाहते हैं, और फिर एक select क्वेरी कि वापसी है निम्नलिखित कॉलम:

  • MONTH_REF
  • योग (T_FOO.amount1) + योग (T_BAR.amount1)
  • योग (T_FOO.amount2) + योग (T_BAR.amount2)

सब कुछ MONTH_REF के मान से समूहित है।

ध्यान दें कि दिए गए MONTH_REF के लिए एक रिकॉर्ड एक तालिका में पाया जा सकता है लेकिन अन्य तालिका में नहीं। इस मामले में, मैं T_FOO.amount1 + 0 (या 0 + T_BAR.amount1) का योग प्राप्त करना चाहता हूं।

इस जानकारी को प्राप्त करने के लिए मैं अपनी SQL क्वेरी कैसे लिख सकता हूं?

जानकारी के लिए, मेरा डेटाबेस ओरेकल 10 जी है।

उत्तर

12

आप संघ कर सकते हैं द्वारा समूह से पहले अपने तालिकाओं (इस ओरेकल पर है , वैसे):

012:

SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2) 
    FROM (SELECT month_ref, amount1, amount2 
      FROM T_FOO 
     WHERE seller = XXX 
     UNION ALL 
     SELECT month_ref, amount1, amount2 
      FROM T_BAR 
     WHERE seller = XXX 
     ) t 
GROUP BY t.month_ref 

तुम भी संघ यह द्वारा विक्रेता क्षेत्र और फिल्टर बाद में साथ तालिकाओं (मामले में आप और अधिक उन्नत तर्क) की आवश्यकता हो सकती

+0

अंततः मैं आपका समाधान (पहला वाला) पसंद करता हूं क्योंकि यह लाइवन समाधान से स्पष्ट है ... – romaintaz

+0

पहला एक और है कुशल क्योंकि आप उप 'चयन' के बाहर 'WHERE' खंड को स्थानांतरित करते समय जल्दी से पंक्तियों की संख्या को कम कर रहे हैं। – JohnB

+0

धन्यवाद मैंने दूसरा इस्तेमाल किया। –

2

क्या आपने संघ का उपयोग करने की कोशिश की है?

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) AS amount1, SUM(amount2) as amount2 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
+0

@romaintaz: कोई समस्या नहीं। एक सवाल, क्या आपने विभिन्न समाधानों का प्रोफाइल किया है? मुझे लगता है कि * द्वारा यूनियन-ग्रुपिंग द्वारा समूह * * समाधान द्वारा * यूनियन-ग्रुपिंग की तुलना में बड़े डेटासेट पर तेज़ी से होगा। –

1

वैकल्पिक रूप से, एक बाहरी में शामिल होने के भी काम करना चाहिए:

SELECT month_ref, 
     SUM(t_foo.amount1) + SUM(t_bar.amount1), 
     SUM(t_foo.amount2)+SUM(t_bar.amount2) 
FROM t_foo FULL OUTER JOIN t_bar 
     ON t_foo.month_ref = t_bar.month_ref 
GROUP BY month_ref 
+0

यह क्वेरी बहुत अधिक समय लेती है (विशेष रूप से लिवन ​​के उत्तर की तुलना में), और इसके अतिरिक्त यह गलत परिणाम देता है। इसे एनवीएल (एसयूएम (...), 0 की भी आवश्यकता है) अन्यथा मुझे शून्य मान मिलेगा ... – romaintaz

1

मैं अंत में यह काम कर Lieven के जवाब का उपयोग कर मिलता है।

यहाँ सही कोड (amount1 = ... मेरी पर्यावरण पर काम नहीं कर रहा है, और भी कई प्रश्न में ; देखते हैं) है:

SELECT MONTH_REF, SUM(sumAmount1), SUM(sumAmount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) as sumAmount1, SUM(amount2) as sumAmount1 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
-1
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts 
+0

कृपया अपने समाधान के बारे में कुछ टिप्पणियां जोड़ें कि यह समस्या क्यों हल करती है और कैसे –

+0

यह आदेश पूर्ण नहीं है .... – taboubim

संबंधित मुद्दे