चेतावनी: एक्वा डेटा स्टूडियो में एक समग्र या अन्य SET ऑपरेशन द्वारा शून्य मान को समाप्त कर दिया जाता है


95

डेटा के अशक्त होने पर मुझे समस्या होती है और परिणाम प्रदर्शित होने पर चेतावनी दिखाई देती है। इस समस्या को हल कैसे करें?। तालिका में कोई डेटा नहीं होने पर शून्य डेटा को 0 में कैसे बदलें?

यह मेरा कोड है: -

SELECT DISTINCT c.username             AS assigner_officer,
                d.description          AS ticketcategory,
                (SELECT Count(closed)
                 FROM   ticket
                 WHERE  assigned_to = c.user_id
                        AND closed IS NOT NULL
                 GROUP  BY assigned_to)closedcases,
                (SELECT Count(closed)
                 FROM   ticket
                 WHERE  assigned_to = c.user_id
                        AND closed IS NULL
                 GROUP  BY assigned_to)opencases
FROM   ticket a
       JOIN ticketlog b
         ON a.ticketid = b.ticketid
       JOIN access c
         ON a.assigned_to = c.user_id
       JOIN ticket_category d
         ON a.cat_code = d.id
       JOIN lookup_department e
         ON a.department_code = e.code 

परिणाम इस प्रकार दिखाई देता है: -

 Warnings: ---> 
   W (1): Warning: Null value is eliminated by an aggregate or other SET operation.
          <--- 
 assigner_officer     ticketcategory     closedcases     opencases    
 -------------------  -----------------  --------------  ------------ 
 abdulhafiz           Enquiry            (null)          0            
 affan                Enquiry            12              (null)       
 amirul               Enquiry            1               (null)       
 azrul_fahmi          Enquiry            45              0            
 Azwani               Enquiry            (null)          0            
 chai                 Enquiry            4               (null)       
 dalinawati           Enquiry            1               0            
 Emmy                 Complaints         (null)          0            
 Fadhlia              Enquiry            38              0            
 fairulhalif          Others             1               (null)       
 farikh               Enquiry            (null)          0            
 ismailh              Enquiry            28              0            
 izzahanna            Enquiry            (null)          0            
 Kamsuzilawati        Enquiry            1               (null)     

1
Count(closed) ... WHERE ... closed IS NULLकोई मायने नहीं COUNTरखता है क्योंकि केवल NOT NULLमान मायने रखता है
मार्टिन स्मिथ


मुझे वही चेतावनी मिल रही है। मुझे चेतावनी में और अपने आप में कोई आपत्ति नहीं है, लेकिन मुझे SQL एजेंट द्वारा चलाई जाने वाली संग्रहीत कार्यविधि की आवश्यकता है, और जब मैं ऐसा करता हूं, तो चेतावनी के कारण एजेंट की नौकरी विफल हो जाती है।
रिचीएसी

इस सवाल का कोई मतलब नहीं है।
xr280xr

जवाबों:


101

आप ज्यादातर COUNTयूआईडी पर संक्षेप में बताएंगे। इसलिये

COUNT([uid]) चेतावनी का उत्पादन करेगा:

चेतावनी: शून्य मान एक समग्र या अन्य SET ऑपरेशन द्वारा समाप्त हो जाता है।

बाईं ओर के साथ प्रयोग किया जा रहा है, जबकि गिने ऑब्जेक्ट मौजूद नहीं है।

COUNT(*)इस मामले में उपयोग करने से गलत परिणाम भी प्रस्तुत होंगे, क्योंकि आप तब मौजूद कुल परिणामों (यानी माता-पिता) की गिनती कर रहे होंगे।

COUNT([uid])मतगणना का एक मान्य तरीका है आईएस का उपयोग करना , और चेतावनी एक चेतावनी से ज्यादा कुछ नहीं है। हालाँकि यदि आप चिंतित हैं, और आप इस मामले में उडियों की सही गणना करना चाहते हैं तो आप इसका उपयोग कर सकते हैं:

SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]

यह आपकी क्वेरी में बहुत अधिक ओवरहेड्स नहीं जोड़ेगा। (परीक्षण 2008 mssql)


1
मैं बहुत खोज की है और सफलता के बिना कोशिश की, लेकिन साथ IsNull मुझे बचाया NULLIF संयोजन का उपयोग कर, उदाहरण के लिए आप इन दो के संयोजन की कोशिश कर सकते हैं: IsNull (NULLIF ([fieldValue], 0), 1)
Qmaster

विशेष रूप से "opencases" कॉलम के लिए समाधान केवल "सेलेक्ट काउंट (1) ..." (या "किसी अन्य शाब्दिक" की "गिनती) के रूप में सरल नहीं होगा? जहां क्लॉज पहले से ही निर्दिष्ट है "और बंद NULL है" तो इस उदाहरण में केस स्टेटमेंट को संक्षेप में प्रस्तुत करने की कोई आवश्यकता नहीं है। इसके अलावा, मैंने सुना है (पूर्व में) कि "गणना (*)" एक एकल स्तंभ या शाब्दिक गिनती के रूप में कुशल नहीं है, लेकिन यकीन है कि अगर अभी भी मामला है।
रोवनपद

इसके बजाय count([uid]), यह उपयोग करने के लिए काम करेगा count(1)?
फरहान

आपने सर @ मट ट्रेहर्ने मुझे बचाया :) मुझे यह एक एक्सेल फाइल में डेटा कनेक्ट करने की कोशिश में मिला, पहले से ही एक ISNULL (x, y) था, लेकिन यह काम नहीं किया, हालांकि "SUM (CASE WHEN X IS NULL THEN) ELSE X END) AS Z "महान काम किया! धन्यवाद!
दिमित्री

19

इस समस्या को हल करने का एक तरीका चेतावनी को बंद करना है।

SET ANSI_WARNINGS OFF;
GO

30
से MSDN , यह केवल समुच्चय में अशक्त के बारे में चेतावनी परिवर्तन नहीं करता है, लेकिन यह भी शून्य और अतिप्रवाह त्रुटियों से विभाजन की हैंडलिंग को संशोधित। यह इस समाधान के लिए मेरे लिए एक "नहीं जाना" का कारण बनता है।
फ्रैडरिक

3
आप इसे किसी भी समस्या के रूप में क्यों मानते हैं? यह सिर्फ सूचनात्मक है
मार्टिन स्मिथ

2
@ मूकस - नहीं, यह नहीं है। यह गंभीरता के स्तर पर एक संदेश प्रिंट करता है। 10 या कुछ भी कम सूचनात्मक है जिसे त्रुटि नहीं माना जाता है। SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
मार्टिन स्मिथ

5
@RichieACC हाँ, क्योंकि यह एक उत्तर नहीं है, और एक सूचना संदेश से बचने के आलसी तरीके के रूप में अत्यंत वांछनीय ANSI चेतावनियों को अक्षम करने से कई अन्य, विशिष्ट रूप से गैर-सूचनात्मक चीजों में टूट-फूट हो जाएगी।
अंडरस्कोर_ड

3
आपकी कार चेतावनी रोशनी का समाधान सिर्फ डैश को अनप्लग करना है। यह शायद सबसे खराब उत्तर है जो मैंने कभी स्टैकओवरफ्लो पर देखा है।
वोरोनोई पोपटो

17

ISNULL(field, 0)इसका उपयोग समुच्चय के साथ भी किया जा सकता है:

ISNULL(count(field), 0)

हालाँकि, आप बदलने पर विचार कर सकते हैं count(field) to count(*)

संपादित करें:

प्रयत्न:

closedcases = ISNULL(
   (select count(closed) from ticket       
    where assigned_to = c.user_id and closed is not null       
    group by assigned_to), 0), 

opencases = ISNULL(
    (select count(closed) from ticket 
     where assigned_to = c.user_id and closed is null 
     group by assigned_to), 0),

मेरे पास कोशिश है लेकिन (अशक्त) अभी भी पंक्ति में मौजूद है। डेटा शून्य होने पर इस मान को 0 में कैसे बदलें?
अमीन एससीओ

धन्यवाद, लेकिन अशक्त नहीं होने पर अशक्त मूल्य को भी वही समस्या मिली। मान को 0 में कैसे बदलें?
अमीन एससीओ

1
FYI करें: ISNULL(count(field), 0)MSSQL 2008 R2 में मेरे लिए काम नहीं किया। मुद्दा इसलिए था क्योंकि मैं मुख्य तालिका से संबंधित ज्वाइन टेबल में रिकॉर्ड की संख्या प्राप्त करने के लिए एक बाईं बाहरी ज्वाइन टेबल में एक फ़ील्ड को गिनने की कोशिश कर रहा था। मैंने एक उप क्वेरी करने के लिए समाप्त किया, जो मुख्य तालिका में आईडी प्रति गिनती प्राप्त करने के लिए दो तालिकाओं में शामिल हुई। उप क्वेरी आईडी पर मुख्य तालिका के लिए बाहरी रूप से जुड़ गई थी। उप क्वेरी की गिनती तब उस ISNULL में लिपटी हुई थी, जिसे मैं चाहता था (चेतावनी संदेश के बिना)।
ट्रिस्ड

1
क्रिस, यह COUNT (ISNULL (फ़ील्ड, 0)) होना चाहिए न कि दूसरे तरीके से। वर्तमान प्रारूप को छोड़कर, जो भी लौटाया जाएगा वह एक 0 है और एक वास्तविक गिनती नहीं है। तर्क: गणना (क्षेत्र) सभी फ़ील्ड मानों के लिए एक एकल NULL लौटाएगा जो अशक्त हैं और ISNULL सेट करेगा कि 0, 0. 0 पर वापस आ रहा है
गोविंद राय

9

आप फ़ंक्शन के ISNULLअंदर रखना चाहते हैं COUNT, बाहर नहीं:

अच्छा नही: ISNULL(COUNT(field), 0)

अच्छा: COUNT(ISNULL(field, 0))


12
ये गलत है। count(ISNULL(field, 0))के बराबर होगा count(*), क्योंकि जो मूल्य गिना जा रहा है वह अब कभी नहीं हो सकता है NULL

@hvd यह गलत नहीं है, मान केवल 0 है जब फ़ील्ड शून्य है।
गोविंद राय

3
@ गोविंदराय नहीं, यह वास्तव में गलत है। यदि आपको लगता है कि आप एक काउंटरएक्सप्ले के साथ आ सकते हैं, तो एक उदाहरण जहां COUNT(ISNULL(field, 0))से अलग है COUNT(*), कृपया ऐसा करें, एसक्यूएल फिडेल इस तरह के एक प्रतिरूप को साझा करना आसान बनाता है। लेकिन आप नहीं कर पाएंगे। चूंकि COUNTवे शून्य हैं, भले ही गैर-शून्य मान मायने रखता हो, और ISNULL(field, 0)हमेशा गैर-शून्य मान होता है, COUNT(ISNULL(field, 0))पंक्तियों को गिना जाता है। यह वही COUNT(*)है जो नहीं है और यहाँ ओपी क्या है।

2
@hvd तुम सही हो। मेरा उत्तर group byओपी के बाद जो था उससे अलग संदर्भ में एक प्रश्न पर आधारित था। मेरे मामले में, ISNULL(COUNT(field), 0)सभी पूर्ण मानों के लिए 0 की एक गिनती लौटाएगा जो कि गलत थी क्योंकि कई शून्य मान थे जबकि COUNT(ISNULL(field),0)कुल # पूर्ण मानों के लिए सही गणना होगी। लेकिन फिर, दो पूरी तरह से अलग परिदृश्य।
गोविंद राय

काम करने के लिए मिल गया। हेयर यू गो! sqlfiddle.com/#!3/ee0546/2 upvoted अपनी टिप्पणी lol
गोविंद राय

-2

मुझे यह त्रुटि मिल रही थी; मैंने सिर्फ WHEREउस क्षेत्र के लिए एक खंड रखा था जो countखंड के भीतर उपयोग किया गया था । इसने इस मुद्दे को हल कर दिया। नोट: यदि शून्य मान मौजूद है, तो जांचें कि क्या रिपोर्ट के लिए महत्वपूर्ण है, जैसा कि गणना में शामिल नहीं है।

पुरानी क्वेरी:

select city, Count(Emp_ID) as Emp_Count 
from Emp_DB
group by city

नया प्रश्न:

select city, Count(Emp_ID) as Emp_Count 
from Emp_DB
where Emp_ID is not null
group by city

-3

यदि कोई Null मान कुल फ़ंक्शन के अंदर मौजूद है, तो आप इस समस्या का सामना करेंगे। नीचे दिए गए कोड के बजाय

 SELECT Count(closed)
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL

का उपयोग करें

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.