Peringatan: Nilai nol dihilangkan oleh operasi agregat atau SET lainnya di Aqua Data Studio

97

Saya punya masalah ketika data nol dan peringatan telah muncul saat hasilnya ditampilkan. Bagaimana mengatasi masalah ini ?. Bagaimana cara mengubah data null menjadi 0 ketika tidak ada data di tabel ?.

Ini kode saya: -

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 

Hasilnya tampak seperti ini: -

 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)     
Amin SCO
sumber
1
Count(closed) ... WHERE ... closed IS NULLtidak masuk akal karena COUNThanya menghitung NOT NULLnilai
Martin Smith
Saya mendapatkan peringatan yang sama. Saya tidak keberatan dengan peringatan itu sendiri, tetapi, saya memerlukan prosedur tersimpan untuk dijalankan oleh Agen SQL, dan ketika saya melakukannya, peringatan tersebut menyebabkan pekerjaan Agen gagal.
RichieACC
Pertanyaan ini tidak masuk akal.
xr280xr

Jawaban:

104

Anda sebagian besar akan menggunakan COUNTuntuk meringkas melalui UID. Karena itu

COUNT([uid]) akan menghasilkan peringatan:

Peringatan: Nilai nol dihilangkan oleh operasi agregat atau SET lainnya.

saat digunakan dengan gabungan kiri, di mana objek yang dihitung tidak ada.

Menggunakan COUNT(*)dalam kasus ini juga akan memberikan hasil yang salah, karena Anda kemudian akan menghitung jumlah total hasil (yaitu orang tua) yang ada.

Menggunakan COUNT([uid])IS sebagai cara menghitung yang valid, dan peringatan itu tidak lebih dari peringatan. Namun jika Anda khawatir, dan Anda ingin mendapatkan jumlah cairan yang sebenarnya dalam kasus ini, Anda dapat menggunakan:

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

Ini tidak akan menambahkan banyak biaya tambahan ke kueri Anda. (diuji mssql 2008)

Mat Traherne
sumber
1
Saya mencari dan mencoba tanpa hasil tetapi menggunakan NULLIF hubungannya dengan ISNULL menyelamatkan saya, Anda dapat mencoba kombinasi keduanya misalnya: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster
Bukankah solusi khusus untuk kolom "opencases" lebih sederhana seperti "pilih hitungan (1) ..." (atau "hitungan" dari literal lainnya)? Klausa Where sudah menentukan "dan ditutup adalah NULL" jadi tidak perlu menjumlahkan pernyataan kasus dalam contoh ini. Juga, saya pernah mendengar (ribuan tahun yang lalu) bahwa "count (*)" tidak seefisien menghitung satu kolom atau literal tetapi tidak yakin apakah itu masih terjadi.
RowanPD
Alih-alih count([uid]), apakah akan berhasil jika digunakan count(1)?
Farhan
Anda pak @Mat Traherne menyelamatkan saya :) Saya mendapatkan ini mencoba menghubungkan data dalam file Excel, sudah memiliki ISNULL (x, y) tetapi itu tidak berhasil, namun "SUM (KASUS KETIKA X NULL MAKA 0 ELSE X AKHIR) AS Z "bekerja dengan baik! Terima kasih!
Dimitri
21

Salah satu cara untuk mengatasi masalah ini adalah dengan mematikan peringatan.

SET ANSI_WARNINGS OFF;
GO
Mukus
sumber
32
Dari msdn , ini tidak hanya mengubah peringatan tentang null secara agregat, tetapi juga mengubah penanganan pembagian dengan nol dan kesalahan luapan. Hal ini menyebabkan solusi ini menjadi "tidak boleh" bagi saya.
Frédéric
3
Mengapa Anda menganggapnya sebagai masalah? ini hanya informasi
Martin Smith
2
@ Mukus - Tidak, tidak. Ini mencetak pesan pada tingkat Severitas 10. Apa pun yang 10 atau lebih rendah bersifat informasional tidak dianggap sebagai kesalahan. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith
5
@RichieACC Ya, karena ini bukan jawaban, dan menonaktifkan peringatan ANSI yang sangat diinginkan sebagai cara malas untuk menghindari satu pesan informasional akan menyebabkan kerusakan pada banyak hal lainnya, hal-hal non-informasional yang jelas.
underscore_d
3
Solusi agar lampu peringatan mobil Anda menyala adalah dengan mencabut dasbor. Ini mungkin jawaban terburuk yang pernah saya lihat di stackoverflow.
VoronoiPotato
18

Gunakan ISNULL(field, 0)Ini juga dapat digunakan dengan agregat:

ISNULL(count(field), 0)

Namun, Anda mungkin mempertimbangkan untuk mengubahnya count(field) to count(*)

Edit:

mencoba:

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),
Chris Gessler
sumber
saya sudah mencoba tetapi (null) masih ada di baris. Bagaimana cara mengubah nilai ini menjadi 0 ketika data nol?
Amin SCO
terima kasih tetapi nilai bukan nol juga mendapat masalah yang sama ketika nol muncul. bagaimana cara mengubah nilainya menjadi 0 ?.
Amin SCO
1
FYI: ISNULL(count(field), 0)tidak bekerja untuk saya di MSSQL 2008 R2. Masalahnya adalah karena saya mencoba menghitung bidang di tabel gabungan luar kiri untuk mendapatkan jumlah rekaman dalam tabel gabungan yang terkait dengan tabel utama. Saya akhirnya harus membuat sub query yang mana bagian dalamnya bergabung dengan dua tabel untuk mendapatkan hitungan per ID di tabel utama. Sub query dibiarkan luar bergabung dengan tabel utama pada ID. Hitungan sub query kemudian dibungkus dalam ISNULL untuk mendapatkan 0 yang saya inginkan (tanpa pesan peringatan).
Dilanggar
1
Chris, seharusnya COUNT (ISNULL (Field, 0)) bukan sebaliknya. Mengkueri format saat ini, semua yang akan dikembalikan adalah 0 dan bukan hitungan nyata. Logika: Count (field) akan mengembalikan satu NULL untuk semua nilai field yang null dan ISNULL akan mengaturnya ke 0, mengembalikan 0.
Govind Rai
10

Anda ingin meletakkan bagian ISNULLdalam COUNTfungsi, bukan di luar:

Tidak baik: ISNULL(COUNT(field), 0)

BAIK: COUNT(ISNULL(field, 0))

Ben Garrison
sumber
12
Ini salah. count(ISNULL(field, 0))akan sama dengan count(*), karena nilai yang sedang dihitung tidak akan pernah bisa lagi NULL.
@hvd tidak salah, nilainya hanya 0 jika field kosong.
Govind Rai
3
@GovindRai Tidak, itu benar-benar salah. Jika Anda yakin Anda bisa mendapatkan counterexample, contoh di mana COUNT(ISNULL(field, 0))berbeda dari COUNT(*), silakan lakukan, SQL Fiddle memudahkan untuk membagikan counterexample. Tapi Anda tidak akan bisa. Karena COUNTmenghitung nilai bukan nol bahkan jika nilainya nol, dan ISNULL(field, 0)selalu nilai bukan nol, COUNT(ISNULL(field, 0))menghitung baris. Itulah tujuan COUNT(*)dan bukan tujuan OP di sini.
2
@VD Anda benar. Jawaban saya didasarkan pada group bypertanyaan dalam konteks yang berbeda dari apa yang dicari OP. Dalam kasus saya, ISNULL(COUNT(field), 0)akan mengembalikan hitungan 0 untuk semua nilai NULL yang salah karena ada beberapa nilai null sedangkan COUNT(ISNULL(field),0)akan mengembalikan jumlah yang benar untuk total # nilai NULL. Tetapi sekali lagi, dua skenario yang sama sekali berbeda.
Govind Rai
Berhasil. Ini dia! sqlfiddle.com/#!3/ee0546/2 Memberi suara positif untuk komentar Anda lol
Govind Rai
-2

Saya mendapatkan kesalahan ini; Saya hanya meletakkan WHEREklausul untuk bidang yang digunakan dalam countklausa. itu memecahkan masalah. Catatan: jika ada nilai null, periksa apakah penting untuk laporan, karena dikecualikan dalam hitungan.

Kueri lama:

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

Kueri baru:

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

Jika ada nilai Null di dalam fungsi agregat, Anda akan menghadapi masalah ini. Alih-alih kode di bawah ini

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

gunakan seperti

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
Maniv
sumber