2013-02-23 16 views
6

मैं दो तालिकाओंयोग और भीतरी करें में शामिल होने

  • Bills है: id amount reference

  • Transactions: id reference amount

निम्नलिखित SQL क्वेरी

SELECT 
    *, 
    (SELECT SUM(amount) 
    FROM transactions 
    WHERE transactions.reference = bils.reference) AS paid 
FROM bills 
GROUP BY id HAVING paid<amount 

तालिका Bills से कुछ पंक्तियों के लिए था, संबंधित लेनदेन की राशि के साथ एक कॉलम paid जोड़ना।

हालांकि, यह केवल तभी काम करता है जब प्रत्येक बिल के लिए कम से कम एक लेनदेन होता है। अन्यथा, एक लेनदेन के लिए कोई लाइन-कम बिल वापस नहीं किया जाता है।

शायद, ऐसा इसलिए है क्योंकि मुझे आंतरिक शामिल होना चाहिए था!

तो मैं निम्न प्रयास करें:

SELECT 
    *, 
    (SELECT SUM(transactions.amount) 
    FROM transactions 
    INNER JOIN bills ON transactions.reference = bills.reference) AS paid 
FROM bills 
GROUP BY id 
HAVING paid < amount 

बहरहाल, यह सभी पंक्तियों के लिए भुगतान की एक ही मान देता है! मैं क्या गलत कर रहा हूं ?

उत्तर

15

एक छोड़ दिया प्रयोग करें एक सबक्वेरी के बजाय शामिल हो:

select b.id, b.amount, b.paid, sum(t.amount) as transactionamount 
from bills b 
left join transactions t on t.reference = b.reference 
group by b.id, b.amount, b.paid 
having b.paid < b.amount 

संपादित करें:
राशि के लेन-देन की राशि की तुलना करने के , जब कोई लेनदेन नहीं होता है तो आपको प्राप्त होने वाले शून्य मूल्य को संभालें:

having isnull(sum(t.amount), 0) < b.amount 
+1

लेकिन 'बिल 'में कोई" भुगतान "कॉलम नहीं है, इसे लेनदेन की राशि के रूप में परिभाषित किया जाना है।अगर मैं इसे सही करने के लिए इसे संशोधित करने का प्रयास करता हूं, तो मुझे अभी भी कम से कम एक लेनदेन के साथ केवल 'बिल' पंक्ति मिलती है। – Klaus

+0

@ क्लोस: मैं देखता हूं, यही वह जगह है जहां से आप इसे प्राप्त कर चुके हैं ... कोई लेनदेन नहीं होने पर योग शून्य हो जाएगा, इसलिए आपको इसे संभालना होगा। उपरोक्त कोड देखें। – Guffa

+0

बहुत बहुत धन्यवाद, 'ifnull' ('isnull' नहीं) और बाएं शामिल होने से चाल चल रही है! – Klaus

2

सभी बिल पंक्तियों को शामिल करने के लिए आपको RIGHT JOIN की आवश्यकता है।

संपादित तो अंतिम क्वेरी किया जाएगा

SELECT 
    *, 
    (SELECT SUM(transactions.amount) 
    FROM transactions 
    WHERE transactions.reference = bills.reference) AS paid 
FROM bills 
WHERE paid < amount 
+0

कि सभी बिलों के लिए सभी लेन-देन की राशि वापस आ जाएगी। – Guffa

+0

अभी भी वही समस्या है जैसा कि मेरे दूसरे प्रयास में है, जैसा कि @ गफा वर्णन करता है। – Klaus

+0

क्या होगा यदि आप "WHERE" – dotNET

0

मुझे पता है कि यह धागा पुराना है, लेकिन मैं आज यहां आया क्योंकि मुझे एक ही समस्या का सामना करना पड़ा।

कृपया एक ही सवाल के साथ एक और पोस्ट देखें: जवाब कहते हैं Sum on a left join SQL

के रूप में, बाईं मेज पर ग्रुप द्वारा उपयोग करें। इस तरह आप बाएं टेबल से सभी रिकॉर्ड प्राप्त करते हैं, और यह सही तालिका से संबंधित पंक्तियों को बताता है।

इस का उपयोग करने का प्रयास करें:

SELECT 
    *, 
    SUM(transactions.sum) 
FROM 
    bills 
RIGHT JOIN 
    transactions 
ON 
    bills.reference = transactions.reference 
WHERE 
    transactions.sum > 0 
GROUP BY 
    bills.id 
संबंधित मुद्दे