मेरे पास दो टेबल हैं। एक में आइटम की मात्रा के साथ ऑफ़र होते हैं, और दूसरे में ऑफ़र के लिए आइटम का आवंटन होता है। मैं एक क्वेरी लिखने की कोशिश कर रहा हूं जो आइटम की पेशकश की गई तालिका और कुल आवंटित राशि, प्रति ऑफ़र दिखाती है।

नमूना तालिका `प्रदान करता है:

+----+----+----+
|oid |uid |amt |
+----+----+----+
|   1| 413|  10|
|   2| 297|   7|
+----+----+----+

नमूना तालिका `आवंटन`:

+----+----+------+
|aid |oid |alloc |
+----+----+------+
|   1|   2|     4|
|   2|   2|     2|
+----+----+------+

मैं निम्नलिखित परिणाम चाहता हूं:

+----+----+------+
|oid |amt |alloc |
+----+----+------+
|   1|  10|     0|
|   2|   7|     6|
+----+----+------+

मैंने निम्नलिखित प्रश्न का प्रयास किया:

SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0)
FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid`

हालाँकि, योग पूरी तालिका पर काम करता है, न कि केवल प्रविष्टियाँ जो संतुष्ट करती हैं

`allocations`.`oid`=`offers`.`oid`

और ऐसे ऑफ़र जिनकी कोई आवंटन नहीं है, मुद्रित नहीं होते हैं।

0
programagor 4 पद 2015, 06:50

3 जवाब

सबसे बढ़िया उत्तर

ग्रुप बाय का उपयोग करके देखें।

SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0)
FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid`
GROUP BY offers.oid

(मुझे लगता है offers.oid आपकी प्राथमिक कुंजी है?)

सख्ती से, यह होना चाहिए

GROUP BY offers.oid, offers.amt

जो यह कहना चाहता है कि किसी भी कार्य को एक समुच्चय समारोह का परिणाम GROUP BY खंड में सूचीबद्ध नहीं किया जाना चाहिए। कुछ सर्वर इसे लागू करने के लिए कॉन्फ़िगर किए गए हैं, जबकि कुछ नहीं हैं।

0
Darwin von Corax 4 पद 2015, 04:19

जब तक आप एक समूह को खंड द्वारा प्रदान नहीं करते हैं, तब तक कोई भी कुल कार्य, जैसे योग () पूरे परिणाम में काम करेगा।

SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0)
FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid`
GROUP BY `offers`.`oid`, `offers`.`amt`

हालाँकि, मुझे 'ऑफ़र नहीं मिलते हैं, जिनके आवंटन आवंटित नहीं होते हैं, मुद्रित नहीं होते हैं', क्योंकि बाएं हाथ को इस बात का ध्यान रखना चाहिए, जब तक कि आपकी वास्तविक क्वेरी में 2 तालिकाओं के क्रम उलट न हों।

0
Shadow 4 पद 2015, 04:03

तो यहाँ आपको प्रत्येक oid के लिए योग करने के लिए समूह द्वारा समूह का उपयोग करना होगा ...

  SELECT `offers`.`oid`, `offers`.`amt`, COALESCE(SUM(`allocations`.`alloc`),0) FROM `offers`
LEFT JOIN `allocations` ON `allocations`.`oid`=`offers`.`oid` group by oid
0
Naruto 4 पद 2015, 04:09