Hai, di mana Anda perlu menghitung kode basis data semacam ini di basis data bahasa apa yang kita bicarakan Salam, Iordan
IordanTanev
2
Saya terkejut tidak ada jawaban tunggal berisi persatuan pilih sederhana (*) ...
Lieven Keersmaekers
1
@ Lieven: Kenapa kamu mau menggunakan di unionsini? Jawaban Montecristo sejauh ini merupakan solusi terbaik.
Eric
1
Karena OP menginginkannya dengan satu permintaan. Jawaban Montecristo memang sejauh ini merupakan solusi terbaik ... dia hanya perlu menambahkan serikat :)
Lieven Keersmaekers
1
Dan itulah yang saya dapatkan ketika membaca judulnya. Akan diedit.
Eric
Jawaban:
231
Ini berfungsi untuk Oracle dan SQL Server (Anda mungkin bisa membuatnya bekerja di RDBMS lain):
select sum(casewhen a isnullthen1else0end) count_nulls
, count(a) count_not_nulls
from us;
Menggunakan perbedaan antara count(*)dan count(a)juga bekerja dengan baikgroup by
shannon
1
@shannon Saya setuju, COUNT(a)adalah komentar yang berguna untuk ditambahkan, tetapi ini tidak memberikan peringatan / kesalahan tergantung pada tumpukan Anda dan mungkin memerlukan komentar dalam kode. Saya lebih suka SUMmetodenya.
Richard
4
Lebih count(*)kecount(1)
Lei Zhao
61
Jika saya mengerti dengan benar Anda ingin menghitung semua NULL dan semua TIDAK NULL dalam kolom ...
Jika itu benar:
SELECT count(*)FROM us WHERE a ISNULLUNIONALLSELECT count(*)FROM us WHERE a ISNOTNULL
Diedit untuk memiliki kueri lengkap, setelah membaca komentar:]
SELECT COUNT(*),'null_tally'AS narrative
FROM us
WHERE a ISNULLUNIONSELECT COUNT(*),'not_null_tally'AS narrative
FROM us
WHERE a ISNOTNULL;
+1: Sejauh ini cara termudah dan tercepat. Saya terkejut ketika setiap jawaban bukan ini.
Eric
6
Ya tapi tidak Saya pikir dia ingin memiliki jumlah NULL dan tidak NULL hanya satu query ... Anda mengatakan bagaimana melakukan itu dalam dua pertanyaan ...
Romain Linsolas
@romaintaz: Benar sekali. Saya membaca judulnya sebagai pertanyaan. Dalam lima suntingan, tidak ada yang berpikir untuk memperbaikinya. Ya.
Eric
@romaintaz: Ya Anda benar, saya menganggap ini sebagai "jalankan permintaan sekali lagi untuk mengetahui berapa banyak nol yang kami miliki", saya bahkan tidak tahu mengapa ^^ ', akan diperbaiki, terima kasih.
Alberto Zaccagni
1
@Montecristo: Karena judul meminta hanya menghitung null:)
Eric
42
Ini adalah versi cepat dan kotor yang berfungsi pada Oracle:
select sum(case a whennullthen1else0)"Null values",
sum(case a whennullthen0else1)"Non-null values"from us
Sintaks yang sama akan bekerja di SQL Server juga. Juga, melakukannya dengan cara ini hanya akan memindai tabel sekali; solusi UNION akan melakukan dua pemindaian tabel. Tidak relevan untuk meja kecil, sangat penting untuk meja besar.
Philip Kelley
2
Hanya perubahan untuk SQL Server "Null values"harus menjadi 'Null values'. Kutipan tunggal, bukan ganda.
Eric
1
SQLServer menggunakan pemindaian indeks untuk kueri ini vs dua indeks yang berusaha menggunakan gabungan. Di atas meja dengan 40.000 baris, tidak ada perbedaan kecepatan.
Lieven Keersmaekers
1
Di atas meja dengan 11.332.581 baris, ada dua pemindaian tabel , tidak ada perbedaan kecepatan yang nyata (sebenarnya, penyatuan sedikit lebih cepat).
Lieven Keersmaekers
1
Ini tidak berhasil untuk saya di Oracle 11g. Versi @ user155789 diposting dengan "case ketika a adalah null maka 1 else 0 end" adalah sintaks yang bekerja.
Steve
25
Saat saya memahami permintaan Anda, Anda cukup menjalankan skrip ini dan mendapatkan Total Null, Total NotNull rows,
Saus yang bagus, teman, lihat rencana eksekusi untuk pertanyaan ini. Anda memulai pemindaian tabel ke kiri dan ke kanan, terutama di mana ada pernyataan sederhana berdarah ( select count(*) from t where a is null) yang melakukan ini.
Eric
2
Saya tidak memiliki database yang mudah dilihat, tetapi kolomnya diindeks atau tidak. Jika ya, itu terjadi melalui pemindaian rentang, jika tidak, Anda cukup banyak dengan pemindaian tabel penuh. Di oracle, NULLs tidak disimpan dalam indeks, jadi saya curiga contoh Anda tidak jauh lebih baik. Jarak Anda mungkin sangat.
EvilTeach
1
@EvilTeach: Indeks hanya membantu ketika Anda tidak menarik kembali> ~ 10% dari baris. Setelah itu, pemindaian penuh dimulai. Dalam hal ini, Anda akan mendapatkan pemindaian setidaknya sekali, jika tidak dua kali.
Eric
19
biasanya saya menggunakan trik ini
select sum(casewhen a isnullthen0else1end)as count_notnull,
sum(casewhen a isnullthen1else0end)as count_null
from tab
groupby a
Seperti yang Anda lihat pada gambar, Hasil pertama menunjukkan tabel memiliki 16 baris. dari mana dua baris NULL. Jadi ketika kita menggunakan Hitung (*) mesin kueri menghitung jumlah baris, Jadi kita mendapat hasil hitung sebagai 16. Tapi dalam kasus Hitung (empid) itu menghitung nilai-nilai NULL-NULL dalam kolom empid . Jadi kami mendapat hasilnya 14.
jadi setiap kali kita menggunakan COUNT (Kolom) pastikan kita menjaga nilai NULL seperti yang ditunjukkan di bawah ini.
select COUNT(isnull(empid,1))from@table1
akan menghitung nilai NULL dan Non-NULL.
Catatan : Hal yang sama berlaku bahkan ketika tabel terdiri dari lebih dari satu kolom. Hitung (1) akan memberikan jumlah total baris terlepas dari nilai NULL / Non-NULL. Hanya ketika nilai kolom dihitung menggunakan Count (Kolom) kita perlu menjaga nilai NULL.
Saya memiliki masalah serupa: untuk menghitung semua nilai yang berbeda, menghitung nilai nol sebagai 1 juga. Hitungan sederhana tidak berfungsi dalam kasus ini, karena tidak memperhitungkan nilai nol.
Berikut cuplikan yang berfungsi pada SQL dan tidak melibatkan pemilihan nilai baru. Pada dasarnya, setelah melakukan yang berbeda, juga mengembalikan nomor baris dalam kolom baru (n) menggunakan fungsi row_number (), kemudian melakukan penghitungan pada kolom itu:
SELECT COUNT(n)FROM(SELECT*, row_number()OVER(ORDERBY[MyColumn]ASC) n
FROM(SELECTDISTINCT[MyColumn]FROM[MyTable]) items
) distinctItems
Ini juga jawaban yang layak. Saya pribadi menemukan bahwa COUNT (DISTINCT ISNULL (A, '')) bekerja lebih baik daripada COUNT (DISTINCT A) + SUM (KASUS SAAT NULL KEMUDIAN 1 LAIN 0 SELESAI)
Vladislav
1
jika ini mysql, Anda dapat mencoba sesuatu seperti ini.
select(select count(*)from TABLENAME WHERE a ='null')as total_null,(select count(*)from TABLENAME WHERE a !='null')as total_not_null
FROM TABLENAME
SELECT SUM(NULLs)AS'NULLS', SUM(NOTNULLs)AS'NOTNULLs'FROM(select count(*)AS'NULLs',0as'NOTNULLs'FROM us WHERE a isnullUNIONselect0as'NULLs', count(*)AS'NOTNULLs'FROM us WHERE a isnotnull)AS x
Ini jelek, tetapi itu akan mengembalikan satu catatan dengan 2 cols menunjukkan jumlah nol vs bukan nol.
Ini bekerja di T-SQL. Jika Anda hanya menghitung jumlah sesuatu dan Anda ingin memasukkan nol, gunakan COALESCE sebagai ganti case.
IF OBJECT_ID('tempdb..#us')ISNOTNULLDROPTABLE#us
CREATETABLE#us
(
a INT NULL);INSERTINTO#us VALUES(1),(2),(3),(4),(NULL),(NULL),(NULL),(8),(9)SELECT*FROM#us
SELECTCASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'ENDAS'NULL?',
COUNT(CASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'END)AS'Count'FROM#us
GROUPBYCASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'ENDSELECTCOALESCE(CAST(a AS NVARCHAR),'NULL')AS a,
COUNT(COALESCE(CAST(a AS NVARCHAR),'NULL'))AS'Count'FROM#us
GROUPBYCOALESCE(CAST(a AS NVARCHAR),'NULL')
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
Vishal Chhodwani
1
Semua jawaban salah atau sangat kedaluwarsa.
Cara sederhana dan benar untuk melakukan kueri ini menggunakan COUNT_IFfungsi.
SELECT
COUNT_IF(a ISNULL)AS nulls,
COUNT_IF(a ISNOTNULL)AS not_nulls
FROM
us
a IS NULLmenghasilkan TRUEatau FALSE, dan COUNT () akan menghitung semua nilai NOT NULL. Jadi count(a is null)akan mengembalikan jumlah semua baris.
ypresto
0
Dalam kasus saya, saya ingin " distribusi nol " di antara banyak kolom:
SELECT(CASEWHEN a ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS a_null,(CASEWHEN b ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS b_null,(CASEWHEN c ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS c_null,...
count(*)FROM us
GROUPBY1,2,3,...ORDERBY1,2,3,...
Sesuai '...' dapat dengan mudah diperluas ke lebih banyak kolom, sebanyak yang dibutuhkan
union
sini? Jawaban Montecristo sejauh ini merupakan solusi terbaik.Jawaban:
Ini berfungsi untuk Oracle dan SQL Server (Anda mungkin bisa membuatnya bekerja di RDBMS lain):
Atau:
sumber
count(*)
dancount(a)
juga bekerja dengan baikgroup by
COUNT(a)
adalah komentar yang berguna untuk ditambahkan, tetapi ini tidak memberikan peringatan / kesalahan tergantung pada tumpukan Anda dan mungkin memerlukan komentar dalam kode. Saya lebih sukaSUM
metodenya.count(*)
kecount(1)
Jika saya mengerti dengan benar Anda ingin menghitung semua NULL dan semua TIDAK NULL dalam kolom ...
Jika itu benar:
Diedit untuk memiliki kueri lengkap, setelah membaca komentar:]
sumber
null
:)Ini adalah versi cepat dan kotor yang berfungsi pada Oracle:
sumber
"Null values"
harus menjadi'Null values'
. Kutipan tunggal, bukan ganda.Saat saya memahami permintaan Anda, Anda cukup menjalankan skrip ini dan mendapatkan Total Null, Total NotNull rows,
sumber
untuk yang bukan nol
untuk nulls
Karenanya
seharusnya melakukan pekerjaan itu
Lebih baik dalam hal judul kolom yang keluar benar.
Dalam beberapa pengujian pada sistem saya, perlu pemindaian tabel penuh.
sumber
select count(*) from t where a is null
) yang melakukan ini.biasanya saya menggunakan trik ini
sumber
Sebagai alternatif lain, Postgres 9.4+ memungkinkan penerapan
FILTER
agregat :SQLFiddle: http://sqlfiddle.com/#!17/80a24/5
sumber
Ini sedikit rumit. Asumsikan tabel hanya memiliki satu kolom, maka Hitung (1) dan Hitung (*) akan memberikan nilai yang berbeda.
Hasil Permintaan
Seperti yang Anda lihat pada gambar, Hasil pertama menunjukkan tabel memiliki 16 baris. dari mana dua baris NULL. Jadi ketika kita menggunakan Hitung (*) mesin kueri menghitung jumlah baris, Jadi kita mendapat hasil hitung sebagai 16. Tapi dalam kasus Hitung (empid) itu menghitung nilai-nilai NULL-NULL dalam kolom empid . Jadi kami mendapat hasilnya 14.
jadi setiap kali kita menggunakan COUNT (Kolom) pastikan kita menjaga nilai NULL seperti yang ditunjukkan di bawah ini.
akan menghitung nilai NULL dan Non-NULL.
Catatan : Hal yang sama berlaku bahkan ketika tabel terdiri dari lebih dari satu kolom. Hitung (1) akan memberikan jumlah total baris terlepas dari nilai NULL / Non-NULL. Hanya ketika nilai kolom dihitung menggunakan Count (Kolom) kita perlu menjaga nilai NULL.
sumber
Saya memiliki masalah serupa: untuk menghitung semua nilai yang berbeda, menghitung nilai nol sebagai 1 juga. Hitungan sederhana tidak berfungsi dalam kasus ini, karena tidak memperhitungkan nilai nol.
Berikut cuplikan yang berfungsi pada SQL dan tidak melibatkan pemilihan nilai baru. Pada dasarnya, setelah melakukan yang berbeda, juga mengembalikan nomor baris dalam kolom baru (n) menggunakan fungsi row_number (), kemudian melakukan penghitungan pada kolom itu:
sumber
Berikut adalah dua solusi:
ATAU
sumber
Mencoba
Sederhana!
sumber
Coba ini..
sumber
Jika Anda menggunakan MS Sql Server ...
Saya tidak merekomendasikan Anda melakukan ini ... tetapi di sini Anda memilikinya (dalam tabel yang sama sebagai hasilnya)
sumber
gunakan fungsi tertanam ISNULL.
sumber
jika ini mysql, Anda dapat mencoba sesuatu seperti ini.
sumber
Ini jelek, tetapi itu akan mengembalikan satu catatan dengan 2 cols menunjukkan jumlah nol vs bukan nol.
sumber
Ini bekerja di T-SQL. Jika Anda hanya menghitung jumlah sesuatu dan Anda ingin memasukkan nol, gunakan COALESCE sebagai ganti case.
sumber
Membangun Alberto, saya menambahkan rollup.
sumber
sumber
sumber
Semua jawaban salah atau sangat kedaluwarsa.
Cara sederhana dan benar untuk melakukan kueri ini menggunakan
COUNT_IF
fungsi.sumber
Untuk berjaga-jaga jika Anda menginginkannya dalam satu catatan:
;-)
sumber
untuk menghitung bukan nilai nol
untuk menghitung nilai nol
sumber
Saya membuat tabel di postgres 10 dan kedua hal berikut ini berfungsi:
select count(*) from us
dan
select count(a is null) from us
sumber
a IS NULL
menghasilkanTRUE
atauFALSE
, dan COUNT () akan menghitung semua nilai NOT NULL. Jadicount(a is null)
akan mengembalikan jumlah semua baris.Dalam kasus saya, saya ingin " distribusi nol " di antara banyak kolom:
Sesuai '...' dapat dengan mudah diperluas ke lebih banyak kolom, sebanyak yang dibutuhkan
sumber
Jumlah elemen di mana a adalah null:
Jumlah elemen di mana a bukan nol:
sumber