Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana COUNT() Bekerja di SQL Server

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 dengan PARTITION 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 memerlukan OVER 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, coba COUNT_BIG() sebagai gantinya.

COUNT_BIG() bekerja sama dengan COUNT() , 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 daripada COUNT() dan COUNT_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 dengan COUNT_BIG() .

Perhatikan juga bahwa, pada saat penulisan APPROX_COUNT_DISTINCT() dalam status pratinjau publik.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Melarikan Diri dari Garis Bawah

  2. Menggunakan Ekspresi CASE di SQL Server

  3. Cara Menambahkan atau Menghapus Kolom dengan Menggunakan GUI di SQL Server - Tutorial SQL Server / T-SQL Bagian 39

  4. Cuplikan Basis Data SQL Server -2

  5. Perbedaan Antara Tabel Sementara Lokal dan Global di SQL Server