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)
sql
sql-server-2005
Amin SCO
sumber
sumber
Count(closed) ... WHERE ... closed IS NULL
tidak masuk akal karenaCOUNT
hanya menghitungNOT NULL
nilaiJawaban:
Anda sebagian besar akan menggunakan
COUNT
untuk meringkas melalui UID. Karena ituCOUNT([uid])
akan menghasilkan peringatan: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)
sumber
count([uid])
, apakah akan berhasil jika digunakancount(1)
?Salah satu cara untuk mengatasi masalah ini adalah dengan mematikan peringatan.
SET ANSI_WARNINGS OFF; GO
sumber
SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Gunakan
ISNULL(field, 0)
Ini juga dapat digunakan dengan agregat: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),
sumber
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).Anda ingin meletakkan bagian
ISNULL
dalamCOUNT
fungsi, bukan di luar:Tidak baik:
ISNULL(COUNT(field), 0)
BAIK:
COUNT(ISNULL(field, 0))
sumber
count(ISNULL(field, 0))
akan sama dengancount(*)
, karena nilai yang sedang dihitung tidak akan pernah bisa lagiNULL
.COUNT(ISNULL(field, 0))
berbeda dariCOUNT(*)
, silakan lakukan, SQL Fiddle memudahkan untuk membagikan counterexample. Tapi Anda tidak akan bisa. KarenaCOUNT
menghitung nilai bukan nol bahkan jika nilainya nol, danISNULL(field, 0)
selalu nilai bukan nol,COUNT(ISNULL(field, 0))
menghitung baris. Itulah tujuanCOUNT(*)
dan bukan tujuan OP di sini.group by
pertanyaan 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 sedangkanCOUNT(ISNULL(field),0)
akan mengembalikan jumlah yang benar untuk total # nilai NULL. Tetapi sekali lagi, dua skenario yang sama sekali berbeda.Saya mendapatkan kesalahan ini; Saya hanya meletakkan
WHERE
klausul untuk bidang yang digunakan dalamcount
klausa. 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
sumber
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
sumber