Di SQL Server, COUNT()
fungsi mengembalikan jumlah item yang ditemukan dalam grup. Anda dapat menggunakannya untuk mengetahui berapa banyak baris dalam tabel atau kumpulan hasil.
Sintaks
Sintaksnya seperti ini:
-- Agregasi Fungsi Sintaks COUNT ( { [ [ ALL | DISTINCT ] ekspresi ] | * } ) -- Analytic Function Syntax COUNT ( [ ALL ] { ekspresi | * } ) OVER ( [] )
ALL
menerapkan fungsi agregat ke semua nilai. Ini adalah nilai default.
DISTINCT
menentukan bahwa fungsi mengembalikan jumlah nilai nonnull yang unik.
expression
adalah ekspresi dari jenis apa pun, kecuali gambar , nteks , atau teks . Fungsi agregat dan subkueri tidak didukung dalam ekspresi.
*
menentukan bahwa semua baris harus dihitung dan dikembalikan, termasuk baris duplikat, dan baris yang berisi nilai nol. COUNT(*)
tidak menggunakan parameter dan tidak mendukung penggunaan DISTINCT
. Itu juga tidak memerlukan ekspresi parameter (karena tidak menggunakan informasi tentang kolom tertentu).
OVER ( [ <partition_by_clause> ]
membagi set hasil yang dihasilkan oleh FROM
klausa ke dalam partisi tempat fungsi diterapkan. Jika tidak ditentukan, fungsi tersebut akan memperlakukan semua baris hasil kueri yang ditetapkan sebagai satu grup.
Contoh 1 – Penggunaan Dasar
Berikut adalah contoh dasar yang menunjukkan cara kerja fungsi ini:
SELECT COUNT(*) AS 'Row Count'FROM Artists;
Hasil:
+-------------+| Hitungan Baris ||-------------|| 16 |+-------------+
Dalam hal ini ada 16 baris dalam Artis tabel.
Untuk memastikannya, ini dia:
PILIH *DARI Artis;
Hasil:
+-------------+------------------------+-------- ------+-------------+| Id Artis | Nama Artis | AktifDari | CountryId ||-------------+------------------------+--------- -----+-------------|| 1 | Gadis Besi | 1975-12-25 | NULL || 2 | AC/DC | 1973-01-11 | NULL || 3 | Allan Holdsworth | 1969-01-01 | NULL || 4 | Teman Kaya | 1919-01-01 | NULL || 5 | Devin Townsend | 1993-01-01 | NULL || 6 | Jim Reeves | 1948-01-01 | NULL || 7 | Tom Jones | 1963-01-01 | NULL || 8 | Merah marun 5 | 1994-01-01 | NULL || 9 | Skrip | 2001-01-01 | NULL || 10 | menyala | 1988-06-26 | NULL || 11 | Sabat Hitam | 1968-01-01 | NULL || 12 | Michael Belajar Rock | 1988-03-15 | NULL || 13 | Carabao | 1981-01-01 | NULL || 14 | Karnivool | 1997-01-01 | NULL || 15 | Burung Tokyo | 2004-01-01 | NULL || 16 | Bodyjar | 1990-01-01 | NULL |+------------+------------------------+--------- -----+-------------+
Seperti yang diharapkan, 16 baris dikembalikan.
Perhatikan bahwa CountryId kolom tidak berisi apa pun kecuali nilai nol. Ini akan berguna untuk contoh berikutnya.
Contoh 2 – Tentukan Kolom
Contoh sebelumnya menggunakan tanda bintang (*
) untuk menentukan semua baris. Ini menghasilkan semua baris yang dihitung, terlepas dari apakah ada duplikat atau jika ada yang berisi nilai nol.
Anda juga dapat menentukan kolom tertentu. Saat Anda melakukan ini, nilai nol tidak dihitung. Artinya, setiap baris yang berisi nilai nol untuk kolom tersebut tidak dihitung.
Berikut ini contoh penggunaan CountryId kolom seperti yang disebutkan pada contoh sebelumnya:
PILIH JUMLAH(Id Negara) SEBAGAI 'Jumlah Baris'FROM Artis;
Hasil:
+-------------+| Hitungan Baris ||-------------|| 0 |+---------+
Seperti yang kita lihat pada contoh sebelumnya, semua baris untuk kolom ini adalah NULL
. Oleh karena itu, jumlah baris yang dihasilkan adalah nol.
Mari tambahkan beberapa nilai ke dalam kolom itu:
PERBARUI ArtistsSET CountryId =2WHERE ArtistName IN ( 'AC/DC', 'Karnivool', 'Birds of Tokyo', 'Bodyjar' );
Sekarang mari kita hitung lagi baris untuk kolom itu:
PILIH JUMLAH(Id Negara) SEBAGAI 'Jumlah Baris'FROM Artis;
Hasil:
+-------------+| Hitungan Baris ||-------------|| 4 |+-------------+
Contoh 3 – Dengan DISTINCT
Contoh ini menggunakan DISTINCT
klausa untuk mengembalikan hanya baris yang berbeda (yaitu non-duplikat).
Pada contoh sebelumnya, saya memperbarui tabel sehingga
CountryId
yang sama diterapkan ke empat artis (saya menggunakan SET CountryId = 2
untuk keempat artis). Ini menghasilkan empat baris dengan
CountryId
yang sama .
Inilah yang terjadi jika saya menghitung berapa banyak CountryId yang berbeda s ada di tabel itu:
SELECT COUNT(DISTINCT CountryId) 'Distinct CountryIds'FROM Artists;
Hasil:
+------------------------+| CountryId Berbeda ||-----------------------|| 1 |+------------------------+
Ini sudah diduga, karena, meskipun ada empat baris dengan CountryId , itu masih hanya satu CountryId yang berbeda .
Untuk memastikannya, mari kita jalankan bersama versi "tidak berbeda"-nya:
SELECT COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM Artists;
Hasil:
+----------------+------------+| Tidak Berbeda | Berbeda ||----------------+------------|| 4 | 1 |+----------------+------------+
Jadi versi yang tidak berbeda menunjukkan berapa kali
CountryId
muncul di tabel, sedangkan DISTINCT
versi menghitung beberapa kemunculan sebagai 1.
Mari tambahkan CountryId lainnya ke meja:
PERBARUI ArtistsSET CountryId =1WHERE ArtistName ='Carabao';
Dan sekarang jalankan kueri lagi:
SELECT COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM Artists;
Hasil:
+----------------+------------+| Tidak Berbeda | Berbeda ||----------------+------------|| 5 | 2 |+----------------+------------+
Contoh 4 – Gunakan Klausa WHERE
Berikut adalah contoh singkat menggunakan WHERE
klausa.
SELECT COUNT(*) AS 'Row Count'FROM ArtistsWHERE ActiveFrom>='2000-01-01';
Hasil:
+-------------+| Hitungan Baris ||-------------|| 2 |+-------------+
Contoh 5 – Dengan GROUP BY
Berikut adalah contoh mengelompokkan artis dalam satu kolom, lalu menghitung semua album untuk setiap artis di kolom lainnya.
Contoh:
SELECT ArtistName, COUNT(al.AlbumId) 'Number of Albums'FROM Artists arINNER JOIN Albums alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'Number of Albums' DESC;
Hasil:
+-------------------------+--------------------+ | Nama Artis | Jumlah Album ||------------------------+-------------------- || Gadis Besi | 5 || Michael Belajar Rock | 3 || Skrip | 3 || Tom Jones | 3 || Devin Townsend | 3 || Allan Holdsworth | 2 || Teman Kaya | 1 || AC/DC | 1 || Jim Reeves | 1 |+-------------------------+--------------------+Contoh 6 – Dengan Klausa HAVING
Kami dapat mengubah contoh sebelumnya untuk menyertakan hanya artis yang memiliki lebih dari jumlah album tertentu. Kita dapat melakukannya dengan menggunakan
HAVING
klausa.SELECT ArtistName, COUNT(al.AlbumId) 'Number of Albums'FROM Artists arINNER JOIN Albums alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameHAVING COUNT(al.AlbumId)> 2ORDER BY 'Number of Albums' DESC;Hasil:
+-------------------------+--------------------+ | Nama Artis | Jumlah Album ||------------------------+-------------------- || Gadis Besi | 5 || Michael Belajar Rock | 3 || Skrip | 3 || Tom Jones | 3 || Devin Townsend | 3 |+-------------------------+--------------------+Contoh 7 – Mempartisi dengan Klausa OVER
Anda dapat menggunakan
OVER
klausa denganPARTITION BY
untuk membagi hasil menjadi partisi.Dalam contoh ini, saya menggunakan
OVER (PARTITION BY ArtistName)
untuk mencantumkan setiap album yang telah dihasilkan artis tersebut, serta jumlah total album untuk artis tersebut.SELECT ArtistName, AlbumName, COUNT(AlbumId) OVER (PARTITION BY ArtistName) 'Jumlah Album dari Artis ini'FROM Artists arINNER JOIN Albums alON al.ArtistId =ar.ArtistIdORDER BY 'Jumlah Album dari Artis ini' DESC;Hasil:
+------------------------+--------------------- -----+-------------------------------------+| Nama Artis | Nama Album | Jumlah Album dari Artis ini ||------------------------+----------------- ---------+------------------------------------------------|| Gadis Besi | budak kekuasaan | 5 || Gadis Besi | Di suatu tempat dalam Waktu | 5 || Gadis Besi | Sepotong Pikiran | 5 || Gadis Besi | Pembunuh | 5 || Gadis Besi | Tidak Ada Doa untuk Kematian | 5 || AC/DC | Daya | 3 || AC/DC | Kembali Hitam | 3 || AC/DC | Batu atau Payudara | 3 || Michael Belajar Rock | Malam Biru | 3 || Michael Belajar Rock | Keabadian | 3 || Michael Belajar Rock | Skandinavia | 3 || Devin Townsend | Ziltoid Yang Mahatahu | 3 || Devin Townsend | Korban Keren | 3 || Devin Townsend | Epicloud | 3 || Tom Jones | Koper Lama Hilang | 3 || Tom Jones | Memuji dan Menyalahkan | 3 || Tom Jones | Seiring Datanglah Jones | 3 || Allan Holdsworth | Semua Malam Salah | 2 || Allan Holdsworth | Enam Belas Pria Tain | 2 || Teman Kaya | Wajah Ayunan Besar | 1 || Jim Reeves | Bernyanyi di Jalan | 1 || Skrip | Tidak Ada Suara Tanpa Keheningan | 1 |+------------------------+---------------------- ----+-------------------------------------+Perhatikan bahwa hal ini menyebabkan jumlah artis dan album berulang di beberapa baris, tetapi hal ini diharapkan terjadi saat kami juga ingin mencantumkan setiap album di barisnya sendiri.
Contoh 8 – Dengan STRING_AGG()
Jika Anda tidak ingin setiap artis dan jumlah album diulang di beberapa baris seperti pada contoh sebelumnya, Anda selalu dapat menggunakan
STRING_AGG()
berfungsi untuk menampilkan album sebagai daftar. Dalam hal ini, Anda tidak memerlukanOVER
klausa.Contoh:
SELECT ArtistName, STRING_AGG(AlbumName, ', ') 'Albums', COUNT(AlbumId) 'Count'FROM Artists arINNER JOIN Albums alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'Count' DESC;Hasil:
+------------------------+--------------------- -------------------------------------------------- ---------+--------+| Nama Artis | Album | Hitung ||------------------------+---------------------- -------------------------------------------------- --------+--------|| Gadis Besi | Powerslave, Di Suatu Tempat Dalam Waktu, Sepotong Pikiran, Pembunuh, Tidak Ada Doa untuk Kematian | 5 || AC/DC | Powerage, Back in Black, Rock or Bust | 3 || Michael Belajar Rock | Malam Biru, Keabadian, Skandinavia | 3 || Devin Townsend | Ziltoid yang Mahatahu, Korban Keren, Epicloud | 3 || Tom Jones | Koper Lama Hilang, Pujian dan Kesalahan, Bersama Jones Datang | 3 || Allan Holdsworth | All Night Wrong, Enam Belas Pria Tain | 2 || Teman Kaya | Wajah Ayunan Besar | 1 || Jim Reeves | Bernyanyi di Jalan | 1 || Skrip | Tidak Ada Suara Tanpa Keheningan | 1 |+------------------------+---------------------- -------------------------------------------------- --------+--------+BANYAK Baris?
COUNT()
fungsi mengembalikan hasilnya sebagai int tipe data. Jika Anda memiliki begitu banyak baris sehingga hasilnya lebih besar dari yang int dapat menangani, cobaCOUNT_BIG()
sebagai gantinya.
COUNT_BIG()
bekerja sama denganCOUNT()
, kecuali bahwa hasilnya dikembalikan sebagai besar nilai tipe data.Anda juga dapat mempertimbangkan untuk menggunakan
APPROX_COUNT_DISTINCT()
dalam beberapa kasus.
APPROX_COUNT_DISTINCT()
mengembalikan nilai perkiraan, bukan nilai yang tepat. Namun, ini dirancang agar jauh lebih responsif daripadaCOUNT()
danCOUNT_BIG()
, jadi ini bisa berguna saat responsivitas lebih penting daripada presisi.Ini dirancang untuk mengembalikan nilai unik dan bukan nol, sehingga hanya akan relevan untuk waktu di mana Anda biasanya menggunakan
DISTINCT
klausa denganCOUNT_BIG()
.Perhatikan juga bahwa, pada saat penulisan
APPROX_COUNT_DISTINCT()
dalam status pratinjau publik.