2010-07-12 22 views
8

में दो टेबल हैं। तालिका ए में कर्मचारी नामों की एक सूची है। टेबल बी कर्मचारियों द्वारा किए गए फोन कॉल के बारे में जानकारी के साथ एक जटिल तालिका है।एसक्यूएल - बाईं ओर समूह

मेरा लक्ष्य कॉलम 'नाम' और 'कॉलकाउंट' के साथ एक टेबल बनाना है। मैं इसे 'बाएं जॉइन' और 'ग्रुप बाय' के साथ ऐसा करने का लक्ष्य रख रहा हूं, लेकिन मैं उन कर्मचारियों को याद रखता हूं जिन्होंने कोई कॉल नहीं किया है। मैं इसे नाम रखने के लिए कैसे प्राप्त कर सकता हूं और बस वहां शून्य डाल सकता हूं?

शायद मैं करीब हूं और कोई मेरे टाइपो को इंगित कर सकता है? धन्यवाद आपकी मदद के लिए अग्रिम में, यहाँ एसक्यूएल है:

SELECT A.name, COUNT(B.call_id) AS 'outgoing call count' 
FROM EmployeeTable A 
LEFT JOIN CallTable B 
ON A.name = B.call_from_name 
WHERE B.call_type LIKE 'outgoing' 
AND B.voice_mail = '0' 
... 
GROUP BY A.name 

उत्तर

25

यह एक बड़ी समस्या नहीं है: आपका फ़िल्टर आउटर जॉइन में आउटर बदल रहा है। इसका मतलब है कि आप केवल COUNT प्राप्त करते हैं जहां आपके पास बाहरी जॉइन की बजाय कॉलटेबल (बी) में पंक्तियां होती हैं।

SELECT A.name, COUNT(B.call_id) AS 'outgoing call count' 
FROM 
    EmployeeTable A 
    LEFT JOIN 
    (
    SELECT call_from_name, call_id FROM CallTable 
    WHERE call_type LIKE 'outgoing' 
    AND voice_mail = '0' 
    AND /* other CallTable filters */ 
    ) B 
    ON A.name = B.call_from_name 
WHERE 
    /* only EmployeeTable A filters */ 
GROUP BY A.name 

संपादित करें: कहीं और अपनी टिप्पणी के बाद, बी पर अपने सभी फिल्टर ली गई तालिका में, होना चाहिए बाहरी जहां में नहीं है।

+0

अद्भुत, बहुत बहुत धन्यवाद! :) – Brandi

+3

जब आपको वाइल्डकार्ड तुलना की आवश्यकता नहीं है तो LIKE का उपयोग करने के बारे में सावधान रहें। यह वास्तव में आपकी क्वेरी की गति को मार सकता है। बस एक नियमित समानता तुलना करें: जहां कॉल_टाइप = 'आउटगोइंग' –

+2

आगे स्पष्टीकरण के लिए: http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM

2

क्योंकि आप एक वाम का उपयोग कर रहे शामिल हों, टेबल के लिए संदर्भ बायाँ में परिभाषित शामिल हों अशक्त हो सकता है। पंक्तियां हैं, आप केवल गिनती मान को शून्य के रूप में नहीं देख रहे हैं। इसका मतलब है आप (इस मामले में) शून्य को यह शून्य मूल्य बदलने की आवश्यकता:

SELECT A.name, 
      COALESCE(COUNT(B.call_id), 0) AS 'outgoing call count' 
    FROM EmployeeTable A 
LEFT JOIN CallTable B ON B.call_from_name = A.name 
        AND B.call_type LIKE 'outgoing' 
        AND B.voice_mail = '0' 
    WHERE ... 
GROUP BY A.name 

यह उदाहरण COALESCE का उपयोग करता है, शून्य मान से निपटने में एक एएनएसआई मानक साधन। यह पहला गैर-शून्य मान वापस कर देगा, लेकिन अगर कोई नहीं पाया जा सकता है तो यह शून्य हो जाएगा। ISNULL SQL सर्वर पर एक वैध विकल्प है, लेकिन यह COALESCE के दौरान अन्य डेटाबेस के लिए पोर्टेबल नहीं है। यहां an MSDN article comparing the two functions है।

+0

कोल्सिस एंट की आवश्यकता है: यह बीई पर WHERE क्लॉज फ़िल्टर है जो इसे एक INNER JOIN – gbn

+0

बनाता है मैंने ISNULL और COALESCE की कोशिश की है, दोनों एक ही परिणाम देते हैं। मैं कुछ और गलत कर रहा हूँ? मेरे पास सूचीबद्ध होने की तुलना में मेरे पास क्लॉज हैं, लेकिन वे गिनती निर्धारित करने के लिए आवश्यक हैं। – Brandi

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