sql server - SUM within SQL Query - Left Outer Join -


यहाँ परिदृश्य है:

टेबल्स:

  ** CallMain: ** Call_ID = पीके (INT) परित्यक्त (INT) या तो 1 या शून्य ** CallHold: ** Hold_ID = पीके (INT) Call_ID = FK (INT) StartTime (INT) eNDTIME (INT)   

कॉलमैन तालिका में आयोजित प्रत्येक कॉलम में या तो 1, 0 या कई धार रिकॉर्ड हो सकते हैं। हर बार जब कॉल पर हो जाता है तो एक रिकार्ड बनाया जाता है जिसे एफके द्वारा धारण के स्टार्टटाइम और पकड़ का एंडटैम के साथ संदर्भित किया जाता है।

अब, कॉल करने के लिए एक क्वेरी में और इनकी कुल जानकारी वापस करने के लिए बार पकड़, मेरा मानना ​​है कि एसक्यूएल इस प्रकार हैं:

  CallMain.Call_ID, CallMain.Abandoned, IsNull का चयन करें ((CallHold.EndTime - CallHold.StartTime), 0) के रूप में CTIStatCall बाएं से HoldPeriodSeconds कॉल करने के लिए कॉलमॉल पर कॉल करें। कॉल_ऑफ = कॉलहोल्ड.कॉल_आईडी   

इस क्वेरी से उन कॉलों के लिए रिकॉर्ड्स वापस करनी चाहिए जिनके पास कोई धार रिकॉर्ड नहीं है और उन्हें नल के रूप में वापस करना चाहिए। एकल पकड़ रिकॉर्ड वाले कॉल सही तरीके से दिखाई देते हैं। शून्य से बाहर आने वाले नलों को ISNULL () फ़ंक्शन के साथ प्रबंधित किया जा रहा है और शून्य के साथ प्रतिस्थापित किया जा रहा है क्योंकि कॉल के पास कोई पकड़ नहीं है।

मेरी समस्या यह है कि एक कॉल कई पकड़ रिकॉर्ड है यह परिणाम में दो बार दिखाया जाएगा यानी:

  Call_ID, HoldPeriod 212, 254 213, 154 214, 158 214, 25 214, 10   < पी> जैसा कि ऊपर देखा जा सकता है, कॉल 214 में एकाधिक पकड़ रिकॉर्ड 1 9 33 हैं। मैं इसे क्वेरी में कैसे जोड़ सकता हूं, इसलिए परिणाम में कॉल रिकॉर्ड को कई बार दोहराए जाने के बजाय यह उस कॉल के लिए केवल कुल पकड़ अवधि दिखाएगा?  

समाधान होने के नाते

  का चयन करें CallMain.Call_ID, CallMain.Abandoned, योग (IsNull ((CallHold.EndTime - CallHold.StartTime), 0)) के रूप में CTIStatCall बाएं से HoldPeriodSeconds बाहरी CallMain.Call_ID = CallHold.Call_ID समूह में शामिल होने के CallMain.Call_ID, CallMain.Abandoned द्वारा CallHold   

@AshReva - यहाँ कोड

  है का चयन करें CallMain .कॉल_आईडी, डेटएड (एस, कॉलमैन.टार्टटी IME, '1970-01-01') के रूप में StartTime, DATEADD (रों, CallMain.AnsTime, '1970-01-01') AnsTime के रूप में, DATEADD (रों, CallMain.EndTime, '1970-01-01') ENDTIME के ​​रूप में , कॉलमैन। परित्याग, (कॉलमैन.एन्सटाइम - कॉलमैन.टार्टटाइम) एआर रिंगपीयरियोड, एसएम (आईएसयूएनएलएल (कॉलहोल्ड। एन्डटाइम - कॉलहोल्ड। स्टार्टटाइम), 0)) होल्डपेरियोड के रूप में, (कॉलमैन एन्डटाइम - कॉल मैने.अन्स्केम) - आईएसएनएलएल (( CallHold.EndTime - CallHold.StartTime), 0) CallMain वाम बाहरी से TalkPeriod के रूप में CallHold पर CallMain.Call_ID = CallHold.Call_ID ग्रुप द्वारा CallMain.Call_ID, CallMain.Abandoned, CallMain.StartTime, CallMain.EndTime, CallMain.AnsTime, CallHold शामिल हों कॉलमैन.कॉल_आईडी द्वारा कॉल टाइम। कॉलम ऑर्डर टाइम आदेश।    

बस योग और समूह का उपयोग करके खंड। देखें कि क्या नीचे काम करता है।

  SELECT CallMain.Call_ID, कॉलमैन। अप्रतिबंधित, योग (ISNULL (कॉलहोल्ड.एंडटाइम - कॉलहोल्ड। स्टार्टटाइम), 0)) के रूप में होल्डपेरियोडसैक्ट्स से सीटीआईएसटैट कॉलम बाएं आउटर कॉलहोल्ड ऑन CallMain.Call_ID = CallHold.Call_ID समूह को CallMain.Call_ID द्वारा, कॉलमैन.परिवर्तित    

Comments

Popular posts from this blog

excel vba - How to delete Solver(SOLVER.XLAM) code -

github - Teamcity & Git - PR merge builds - anyway to get HEAD commit hash? -

ios - Replace text in UITextView run slowly -