คำเตือน: ค่า Null ถูกกำจัดโดยการรวมหรือการดำเนินการ SET อื่น ๆ ใน Aqua Data Studio


97

ฉันมีปัญหาเมื่อข้อมูลเป็นโมฆะและคำเตือนปรากฏขึ้นเมื่อแสดงผล จะแก้ปัญหานี้อย่างไร?. จะเปลี่ยนข้อมูล null เป็น 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 Agent และเมื่อฉันทำเช่นนั้นคำเตือนจะทำให้งาน Agent ล้มเหลว
RichieACC

คำถามนี้ไม่สมเหตุสมผล
xr280xr

คำตอบ:


104

ส่วนใหญ่คุณจะใช้COUNTเพื่อสรุปผ่าน UID ดังนั้น

COUNT([uid]) จะสร้างคำเตือน:

คำเตือน: ค่า Null ถูกตัดออกโดยการรวมหรือการดำเนินการอื่น ๆ ของ SET

ในขณะที่ใช้กับการรวมด้านซ้ายโดยที่ไม่มีวัตถุที่ถูกนับ

การใช้COUNT(*)ในกรณีนี้จะทำให้ผลลัพธ์ที่ไม่ถูกต้องเช่นกันเนื่องจากคุณจะนับจำนวนผลลัพธ์ทั้งหมด (เช่นผู้ปกครอง) ที่มีอยู่

การใช้COUNT([uid])IS เป็นวิธีการนับที่ถูกต้องและคำเตือนก็ไม่มีอะไรมากไปกว่าคำเตือน อย่างไรก็ตามหากคุณกังวลและต้องการรับจำนวน uids ที่แท้จริงในกรณีนี้คุณสามารถใช้:

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

สิ่งนี้จะไม่เพิ่มค่าใช้จ่ายในการสืบค้นของคุณมากนัก (ทดสอบ mssql 2008)


1
ฉันจึงค้นหาและลองโดยไม่ประสบความสำเร็จ แต่การใช้ NULLIF ร่วมกับ ISNULL ช่วยฉันได้คุณสามารถลองรวมสองอย่างนี้ได้เช่น ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster

วิธีแก้ปัญหาเฉพาะสำหรับคอลัมน์ "opencases" จะไม่ง่ายกว่าเพียงแค่ "select count (1) ... " (หรือ "count" ของลิเทอรัลอื่น ๆ ) หรือไม่? ประโยค Where ระบุอยู่แล้ว "และ closed is NULL" ดังนั้นจึงไม่จำเป็นต้องสรุป case statement ในอินสแตนซ์นี้ นอกจากนี้ฉันเคยได้ยิน (เมื่อก่อน) ว่า "count (*)" ไม่มีประสิทธิภาพเท่ากับการนับคอลัมน์เดียวหรือตามตัวอักษร แต่ไม่แน่ใจว่ายังคงเป็นเช่นนั้นหรือไม่
RowanPD

แทนที่จะcount([uid])ใช้งานได้count(1)หรือไม่?
Farhan

คุณ @Mat Traherne ช่วยฉันไว้ :) ฉันพยายามเชื่อมต่อข้อมูลในไฟล์ Excel แล้วมี ISNULL (x, y) อยู่แล้ว แต่ไม่ได้ผลอย่างไรก็ตาม "SUM (กรณีเมื่อ X เป็นโมฆะแล้ว 0 ELSE X END) AS Z "ทำได้ดีมาก! ขอบคุณ!
Dimitri

21

วิธีหนึ่งในการแก้ปัญหานี้คือการปิดคำเตือน

SET ANSI_WARNINGS OFF;
GO

32
จากmsdnสิ่งนี้ไม่เพียง แต่เปลี่ยนคำเตือนเกี่ยวกับ null ในการรวมเท่านั้น แต่ยังแก้ไขการจัดการการหารด้วยศูนย์และข้อผิดพลาดล้น ซึ่งทำให้การแก้ปัญหานี้ "ไม่ไป" สำหรับฉัน
Frédéric

3
ทำไมคุณถึงมองว่ามันเป็นปัญหาล่ะ? เป็นเพียงข้อมูลเท่านั้น
Martin Smith

2
@ มูกัส - ไม่มันไม่ได้ มันพิมพ์ข้อความที่ระดับความรุนแรง 10 อะไรก็ตามที่ 10 หรือต่ำกว่าเป็นข้อมูลไม่ถือเป็นข้อผิดพลาด SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith

5
@RichieACC ใช่เพราะนี่ไม่ใช่คำตอบและการปิดใช้งานคำเตือน ANSI ที่พึงปรารถนาอย่างยิ่งเนื่องจากวิธีขี้เกียจในการหลีกเลี่ยงข้อความที่ให้ข้อมูลจะทำให้เกิดความแตกแยกในสิ่งอื่น ๆ ที่ไม่ให้ข้อมูลอย่างชัดเจน
underscore_d

3
วิธีแก้ปัญหาไฟเตือนรถของคุณที่เปิดอยู่คือแค่ถอดปลั๊กแดช นี่อาจเป็นคำตอบที่แย่ที่สุดที่ฉันเคยเห็นใน stackoverflow
VoronoiPotato

18

ใช้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),

ฉันได้ลองแล้ว แต่ (null) ยังคงอยู่ในแถว จะเปลี่ยนค่านี้เป็น 0 ได้อย่างไรเมื่อข้อมูลเป็นโมฆะ
Amin SCO

ขอบคุณ แต่ค่าที่ไม่เป็นค่าว่างก็มีปัญหาเดียวกันเมื่อค่าว่างปรากฏขึ้น จะเปลี่ยนค่าเป็น 0 ได้อย่างไร?.
Amin SCO

1
FYI: ISNULL(count(field), 0)ไม่ได้ผลสำหรับฉันใน MSSQL 2008 R2 ปัญหาเกิดจากฉันพยายามนับเขตข้อมูลในตารางรวมด้านนอกด้านซ้ายเพื่อรับจำนวนระเบียนในตารางที่เข้าร่วมที่เกี่ยวข้องกับตารางหลัก ฉันต้องสร้างแบบสอบถามย่อยซึ่งภายในเข้าร่วมทั้งสองตารางเพื่อรับจำนวนต่อ ID ในตารางหลัก คิวรีย่อยถูกทิ้งไว้ภายนอกรวมกับตารางหลักบน ID จากนั้นจำนวนของแบบสอบถามย่อยจะถูกรวมไว้ใน ISNULL เพื่อให้ได้ 0 ที่ฉันต้องการ (โดยไม่มีข้อความเตือน)
Trisped

1
คริสควรเป็น COUNT (ISNULL (ฟิลด์ 0)) ไม่ใช่ทางอื่น การค้นหารูปแบบปัจจุบันสิ่งที่จะถูกส่งกลับคือ 0 และไม่ใช่จำนวนจริง ลอจิก: Count (ฟิลด์) จะส่งคืนค่า NULL เดียวสำหรับค่าฟิลด์ทั้งหมดที่เป็นโมฆะและ ISNULL จะตั้งค่าเป็น 0 โดยส่งคืน 0
Govind Rai

10

คุณต้องการใส่ISNULLด้านในของCOUNTฟังก์ชันไม่ใช่ด้านนอก:

ไม่ดี: ISNULL(COUNT(field), 0)

ดี: COUNT(ISNULL(field, 0))


12
นี่เป็นสิ่งที่ไม่ถูกต้อง count(ISNULL(field, 0))จะเทียบเท่ากับเป็นค่าที่ถูกนับไม่สามารถที่เคยเป็นcount(*) NULL

@hvd ไม่ผิดค่าเป็น 0 เมื่อฟิลด์เป็นโมฆะเท่านั้น
Govind Rai

3
@GovindRai ไม่มันผิดจริงๆ หากคุณเชื่อว่าคุณสามารถหาตัวอย่างการตอบโต้ได้ตัวอย่างที่COUNT(ISNULL(field, 0))แตกต่างออกCOUNT(*)ไปโปรดทำเช่นนั้นSQL Fiddleทำให้ง่ายต่อการแบ่งปันตัวอย่างการตอบโต้ แต่คุณจะไม่สามารถทำได้ เนื่องจากCOUNTนับค่าที่ไม่ใช่ค่าว่างแม้ว่าจะเป็นศูนย์และISNULL(field, 0)เป็นค่าที่ไม่ใช่ค่าว่างเสมอจึงCOUNT(ISNULL(field, 0))นับแถว นั่นคือสิ่งที่COUNT(*)มีไว้สำหรับและไม่ใช่สิ่งที่ OP ที่นี่คือหลังจากนั้น

2
@hvd คุณถูกต้อง คำตอบของฉันขึ้นอยู่กับgroup byแบบสอบถามในบริบทที่แตกต่างจากสิ่งที่ OP เกิดขึ้นหลังจากนั้น ในกรณีของฉันISNULL(COUNT(field), 0)จะส่งคืนจำนวน 0 สำหรับค่า NULL ทั้งหมดซึ่งไม่ถูกต้องเนื่องจากมีค่า null หลายค่าในขณะที่COUNT(ISNULL(field),0)จะส่งคืนการนับที่ถูกต้องสำหรับจำนวนค่าทั้งหมดของ NULL แต่อีกครั้งสองสถานการณ์ที่แตกต่างกันโดยสิ้นเชิง
Govind Rai

เตรียมพร้อมที่จะทำงาน จัดไป! sqlfiddle.com/#!3/ee0546/2 อัพคะแนนความคิดเห็นของคุณ lol
Govind Rai

-2

ฉันได้รับข้อผิดพลาดนี้ ฉันเพิ่งใส่WHEREอนุประโยคสำหรับเขตข้อมูลที่ใช้ภายในcountประโยค มันแก้ปัญหาได้ หมายเหตุ: หากมีค่า null ให้ตรวจสอบว่ามีความสำคัญสำหรับรายงานหรือไม่เนื่องจากไม่รวมอยู่ในการนับ

คำถามเก่า:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.