Saat menggunakan count()
fungsi di SQLite, Anda mungkin menemukan diri Anda dalam situasi di mana Anda hanya ingin menghitung nilai yang berbeda. Artinya, Anda tidak ingin nilai duplikat dihitung beberapa kali.
Dengan kata lain, jika kolom memiliki nilai yang sama beberapa kali, kolom tersebut seharusnya hanya menghitung nilai tersebut satu kali.
Secara default, count()
akan menyertakan semua nilai duplikat dalam perhitungannya. Misalnya, jika nilai “Kucing” muncul 3 kali, count()
akan menghitungnya sebagai 3.
Namun, jika Anda hanya ingin nilai yang berbeda dihitung, maka count()
akan menghitungnya sebagai 1.
Untungnya, ada cara mudah untuk melakukan ini. Yang perlu Anda lakukan adalah menambahkan DISTINCT
kata kunci ke count()
. Anda fungsi. Seperti ini:
count(DISTINCT x)
Dimana x
adalah nama kolom untuk konten yang Anda hitung (atau seluruh baris jika Anda menggunakan karakter pengganti asterisk).
Contoh
Ambil tabel berikut:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 2 Blue Widget 10.0 3 Red Widget 10.0 4 Green Widget 10.0 5 Widget Stick 89.75 6 Foo Cap 11.99
Perhatikan bahwa baris 2 hingga 4 semuanya memiliki harga yang sama (10.0).
Jika saya melakukan count()
normal yang normal pada Harga kolom, itu akan menghitung semua enam baris.
SELECT count(Price) FROM Products;
Hasil:
6
Namun, jika saya menambahkan DISTINCT
kata kunci, itu akan menghitung tiga baris itu sebagai satu.
SELECT count(DISTINCT Price) FROM Products;
Hasil:
4
Hitung Baris Berbeda
count()
fungsi menerima wildcard asterisk (*
), yang berarti akan menghitung semua baris.
Namun, Anda mungkin akan mendapatkan kesalahan jika mencoba menggunakan DISTINCT
saat menggunakan wildcard asterisk.
Berikut tabel dengan baris duplikat.
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
Secara teori, saya seharusnya bisa menggunakan DISTINCT
untuk menghitung baris "de-duped" dalam tabel ini. Namun, itu sepertinya tidak mungkin.
SELECT count(DISTINCT *)
FROM States;
Hasil:
Error: near "*": syntax error
Sebagai gantinya, saya perlu menentukan nama kolom saat menggunakan DISTINCT
kata kunci.
SELECT
count(State),
count(DISTINCT State)
FROM States;
Hasil:
count(State) count(DISTINCT State) ------------ --------------------- 7 6
Cara lain untuk melakukannya adalah dengan melakukan sesuatu seperti ini:
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
Hasil:
6
Ini seharusnya tidak menjadi masalah, karena umumnya bukan desain database yang baik untuk mengizinkan baris duplikat seperti ini.