Saya telah mengembangkan kueri, dan dalam hasil untuk tiga kolom pertama saya dapatkan NULL
. Bagaimana saya bisa menggantinya 0
?
Select c.rundate,
sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,
sum(case when c.runstatus = 'Failed' then 1 end) as Failed,
sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled,
count(*) as Totalrun from
( Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
---cast(run_date as datetime)
cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/' +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock)
on a.job_id=b.job_id
where a.name='AI'
and b.step_id=0) as c
group by
c.rundate
sql
sql-server
Bhaskar Mishra
sumber
sumber
Jawaban:
Saat Anda ingin mengganti
null
kolom yang mungkin dengan yang lain, gunakan IsNull .Ini akan menempatkan 0 di myColumn jika itu nol di tempat pertama.
sumber
Anda dapat menggunakan kedua metode ini tetapi ada perbedaan:
Membandingkan COALESCE () dan ISNULL ():
Fungsi ISNULL dan ekspresi COALESCE memiliki tujuan yang sama tetapi dapat berperilaku berbeda.
Karena ISNULL adalah fungsi, ia dievaluasi hanya sekali. Seperti dijelaskan di atas, nilai input untuk ekspresi COALESCE dapat dievaluasi beberapa kali.
Penentuan tipe data dari ekspresi yang dihasilkan berbeda. ISNULL menggunakan tipe data dari parameter pertama, COALESCE mengikuti aturan ekspresi KASUS dan mengembalikan tipe data nilai dengan prioritas tertinggi.
NULLability dari ekspresi hasil berbeda untuk ISNULL dan COALESCE. Nilai kembali ISNULL selalu dianggap TIDAK NULLable (dengan asumsi nilai kembali adalah non-nullable) sedangkan COALESCE dengan parameter non-nol dianggap NULL. Jadi ekspresi ISNULL (NULL, 1) dan COALESCE (NULL, 1) meskipun setara memiliki nilai nullability yang berbeda. Ini membuat perbedaan jika Anda menggunakan ekspresi ini dalam kolom yang dihitung, membuat batasan kunci atau membuat nilai pengembalian skalar UDF deterministik sehingga dapat diindeks seperti yang ditunjukkan pada contoh berikut.
- Pernyataan ini gagal karena PRIMARY KEY tidak dapat menerima nilai NULL - dan nullability dari ekspresi COALESCE untuk col2 - mengevaluasi ke NULL.
- Pernyataan ini berhasil karena nullability dari fungsi - ISNULL mengevaluasi AS NOT NULL.
Validasi untuk ISNULL dan COALESCE juga berbeda. Sebagai contoh, nilai NULL untuk ISNULL dikonversi ke int sedangkan untuk COALESCE, Anda harus memberikan tipe data.
ISNULL hanya membutuhkan 2 parameter sedangkan COALESCE mengambil sejumlah variabel parameter.
jika Anda perlu tahu lebih banyak di sini adalah dokumen lengkap dari msdn.
sumber
Dengan
coalesce
:Meskipun, ketika dijumlahkan
when condition then 1
, Anda bisa dengan mudah berubahsum
kecount
- misalnya:(
Count(null)
mengembalikan 0, sementarasum(null)
mengembalikan nol.)sumber
Ketika Anda mengatakan tiga kolom pertama, apakah maksud Anda
SUM
kolom Anda ? Jika demikian, tambahkanELSE 0
keCASE
pernyataan Anda . NilaiSUM
sebuahNULL
adalahNULL
.sumber
Cara sederhana adalah
sumber
Bungkus kolom Anda dalam kode ini.
Mungkin periksa mengapa Anda mendapatkan nol
sumber
Gunakan
COALESCE
, yang mengembalikan nilai bukan nol pertama misalnyaAkan menetapkan Succeeded sebagai 0 jika dikembalikan sebagai
NULL
.sumber
Tambahkan yang lain ke pernyataan kasus Anda sehingga menjadi nol jika kondisi pengujian tidak ditemukan. Saat ini jika kondisi pengujian tidak ditemukan, NULL diteruskan ke fungsi SUM ().
sumber
Jika Anda menggunakan Presto, AWS Athena dll, tidak ada fungsi ISNULL (). Sebaliknya, gunakan:
sumber
masalahnya di sini adalah bahwa tanpa pernyataan lain, Anda terikat untuk menerima Null ketika status run bukan status yang dinyatakan dalam deskripsi kolom. Menambahkan apa pun ke Null akan menghasilkan Null, dan itu adalah masalah dengan permintaan ini.
Semoga berhasil!
sumber
dengan mengikuti jawaban sebelumnya saya kehilangan nama kolom saya di SQL server db namun mengikuti sintaks ini membantu saya untuk mempertahankan ColumnName juga
sumber