Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как COUNT() работи в SQL Server

В SQL Server, COUNT() функцията връща броя на елементите, намерени в група. Можете да го използвате, за да разберете колко реда има в таблица или набор от резултати.

Синтаксис

Синтаксисът е така:

-- БРОЙ синтаксис на функцията за агрегиране ( { [ [ ALL | DISTINCT ] израз ] | * } ) -- COUNT синтаксис на аналитична функция ( [ ALL ] { израз | * } ) НАД ( [  ] )

ALL прилага агрегатната функция към всички стойности. Това е стойността по подразбиране.

DISTINCT указва, че функцията връща броя на уникалните ненулеви стойности.

expression е израз от всякакъв тип, с изключение на изображение , ntext , или текст . Обобщени функции и подзаявки не се поддържат в израза.

* указва, че всички редове трябва да бъдат преброени и върнати, включително дублиращи се редове и редове, които съдържат нулеви стойности. COUNT(*) не приема параметри и не поддържа използването на DISTINCT . Освен това не изисква израз параметър (тъй като не използва информация за конкретна колона).

OVER ( [ <partition_by_clause> ] разделя резултатния набор, произведен от FROM клауза в дялове, към които се прилага функцията. Ако не е посочено, функцията третира всички редове от резултата от заявката като една група.

Пример 1 – Основна употреба

Ето основен пример, показващ как работи тази функция:

ИЗБЕРЕТЕ БРОЙ(*) КАТО „Брой на редове“ ОТ Изпълнители;

Резултат:

+------------+| Брой редове ||------------|| 16 |+------------+

В този случай има 16 реда в Изпълнители таблица.

Само за да сме сигурни, ето ги:

ИЗБЕРЕТЕ *ОТ Изпълнители;

Резултат:

+------------+------------------------+-------- ------+------------+| ArtistId | Име на изпълнител | ActiveFrom | CountryId ||-----------+-----------------------+-------- -----+------------|| 1 | Iron Maiden | 1975-12-25 | NULL || 2 | AC/DC | 11.01.1973 г. | NULL || 3 | Алън Холдсуърт | 1969-01-01 | NULL || 4 | Бъди Рич | 1919-01-01 | NULL || 5 | Девин Таунсенд | 1993-01-01 | NULL || 6 | Джим Рийвс | 1948-01-01 | NULL || 7 | Том Джоунс | 1963-01-01 | NULL || 8 | Maroon 5 | 1994-01-01 | NULL || 9 | Сценарият | 2001-01-01 | NULL || 10 | Осветено | 1988-06-26 | NULL || 11 | Black Sabbath | 1968-01-01 | NULL || 12 | Майкъл се научава да рок | 15.03.1988 | NULL || 13 | Карабао | 1981-01-01 | NULL || 14 | Karnivool | 1997-01-01 | NULL || 15 | Птиците от Токио | 2004-01-01 | NULL || 16 | Bodyjar | 1990-01-01 | NULL |+-----------+-----------------------+-------- -----+------------+

Както се очаква, се връщат 16 реда.

Забележете, че CountryId колоната не съдържа нищо освен нулеви стойности. Това ще бъде полезно за следващия пример.

Пример 2 – Посочете колона

Предишният пример използва звездичка (* ), за да посочите всички редове. Това води до преброяване на всички редове, независимо дали има дубликати или съдържат нулеви стойности.

Можете също да посочите конкретна колона. Когато направите това, нулевите стойности не се отчитат. Тоест всички редове, съдържащи нулева стойност за тази колона, не се отчитат.

Ето пример за използване на CountryId колона, както е споменато в предишния пример:

ИЗБЕРЕТЕ COUNT(CountryId) КАТО „Брой на редове“ ОТ Изпълнители;

Резултат:

+------------+| Брой редове ||------------|| 0 |+------------+

Както видяхме в предишния пример, всички редове за тази колона са NULL . Следователно резултантният брой редове е нула.

Нека добавим някои стойности в тази колона:

UPDATE ArtistsSET CountryId =2WHERE ArtistName IN („AC/DC“, „Karnivool“, „Birds of Tokyo“, „Bodyjar“);

Сега нека отново преброим редовете за тази колона:

ИЗБЕРЕТЕ COUNT(CountryId) КАТО „Брой на редове“ ОТ Изпълнители;

Резултат:

+------------+| Брой редове ||------------|| 4 |+------------+

Пример 3 – С DISTINCT

Този пример използва DISTINCT клауза за връщане само на отделни редове (т.е. недублирани).

В предишния пример актуализирах таблицата, така че същият CountryId беше приложен към четирима изпълнители (използвах SET CountryId = 2 за четиримата художници). Това доведе до четири реда със същия CountryId .

Ето какво се случва, ако преброя колко различни CountryId s са в тази таблица:

ИЗБЕРЕТЕ COUNT(DISTINCT CountryId) 'Distinct CountryIds'FROM Изпълнители;

Резултат:

<пред>+-----------------------+| Различни идентификатори на държави ||-----------------------|| 1 |+-----------------------+

Това може да се очаква, защото въпреки че има четири реда с CountryId , все още е само един отделен CountryId .

Само за да сме сигурни, нека го стартираме заедно с неговата „неотличима“ версия:

ИЗБЕРЕТЕ COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM Artists;

Резултат:

+----------------+------------+| Неразличими | Различни ||----------------+-----------|| 4 | 1 |+----------------+-----------+

Така че неразличимата версия показва колко пъти CountryId се появява в таблицата, докато DISTINCT версията отчита множеството поява за 1.

Нека добавим още един CountryId към масата:

UPDATE ArtistsSET CountryId =1WHERE ArtistName ='Carabao';

И сега стартирайте заявката отново:

ИЗБЕРЕТЕ COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM Artists;

Резултат:

+----------------+------------+| Неразличими | Различни ||----------------+-----------|| 5 | 2 |+----------------+-----------+

Пример 4 – Използвайте клауза WHERE

Ето един бърз пример за използване на WHERE клауза.

ИЗБЕРЕТЕ COUNT(*) КАТО 'Брой на редове'FROM ArtistsWHERE ActiveFrom>='2000-01-01';

Резултат:

+------------+| Брой редове ||------------|| 2 |+------------+

Пример 5 – С GROUP BY

Ето пример за групиране на изпълнителите в една колона, след което преброяване на всички албуми за всеки изпълнител в другата колона.

Пример:

ИЗБЕРЕТЕ ИМЕ на изпълнител, COUNT(al.AlbumId) 'Брой албуми'ОТ Изпълнители arINNER ПРИСЪЕДИНЕТЕ Албуми alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'Брой албуми' DESC;

Резултат:

+-------------------+--------------------+ | Име на изпълнител | Брой албуми ||-----------------------+-------------------- || Iron Maiden | 5 || Майкъл се научава да рок | 3 || Сценарият | 3 || Том Джоунс | 3 || Девин Таунсенд | 3 || Алън Холдсуърт | 2 || Бъди Рич | 1 || AC/DC | 1 || Джим Рийвс | 1 |+------------------------+--------------------+ 

Пример 6 – С клаузата HAVING

Можем да настроим предишния пример, за да включим само онези изпълнители, които имат повече от определен брой албуми. Можем да направим това с помощта на HAVING клауза.

ИЗБЕРЕТЕ Име на изпълнител, COUNT(al.AlbumId) 'Брой албуми'ОТ ИЗПЪЛНИТЕЛИ arINNER ПРИСЪЕДИНЕТЕ се към албуми alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameHAVING COUNT(al.AlbumId)> 2ORDER BY 'Брой албуми'; 

Резултат:

+-------------------+--------------------+ | Име на изпълнител | Брой албуми ||-----------------------+-------------------- || Iron Maiden | 5 || Майкъл се научава да рок | 3 || Сценарият | 3 || Том Джоунс | 3 || Девин Таунсенд | 3 |+-----------------------+--------------------+ 

Пример 7 – Разделяне с клауза OVER

Можете да използвате OVER клауза с PARTITION BY за разделяне на резултатите на дялове.

В този пример използвам OVER (PARTITION BY ArtistName) за да изброите всеки албум, който изпълнителят е продуцирал, както и общия брой албуми за този изпълнител.

SELECT ArtistName, AlbumName, COUNT(AlbumId) OVER (PARTITION BY ArtistName) 'Брой албуми от този изпълнител'FROM Изпълнители arINNER ПРИСЪЕДИНЕТЕ се Албуми alON al.ArtistId =ar.ArtistIdORDER BY 'Брой албуми от този изпълнител' DESC; 

Резултат:

+-----------------------+--------------------- -----+-------------------------------------+| Име на изпълнител | Име на албум | Брой албуми от този изпълнител ||-----------------------+----------------- ---------+---------------------------------------|| Iron Maiden | Powerslave | 5 || Iron Maiden | Някъде във времето | 5 || Iron Maiden | Част от ума | 5 || Iron Maiden | Убийци | 5 || Iron Maiden | Без молитва за умиращите | 5 || AC/DC | Мощност | 3 || AC/DC | Отново в черно | 3 || AC/DC | Рок или бюст | 3 || Майкъл се научава да рок | Синя нощ | 3 || Майкъл се научава да рок | Вечност | 3 || Майкъл се научава да рок | Скандинавия | 3 || Девин Таунсенд | Зилтоид Всезнаещият | 3 || Девин Таунсенд | Жертвите на Cool | 3 || Девин Таунсенд | Epicloud | 3 || Том Джоунс | Дълго изгубен куфар | 3 || Том Джоунс | Похвала и порицание | 3 || Том Джоунс | Along Came Jones | 3 || Алън Холдсуърт | Цяла нощ грешно | 2 || Алън Холдсуърт | Шестнадесетте мъже от Тейн | 2 || Бъди Рич | Big Swing Face | 1 || Джим Рийвс | Пеене надолу по алеята | 1 || Сценарият | Няма звук без тишина | 1 |+-----------------------+--------------------- ----+-------------------------------------+

Имайте предвид, че това кара броят на изпълнителите и албумите да се повтарят в няколко реда, но това може да се очаква, когато искаме също да изброим всеки албум на отделен ред.

Пример 8 – С STRING_AGG()

Ако не искате всеки изпълнител и брой албуми да се повтарят на няколко реда, както в предишния пример, винаги можете да използвате STRING_AGG() функция за извеждане на албумите като списък. В този случай няма да имате нужда от OVER клауза.

Пример:

SELECT ArtistName, STRING_AGG(AlbumName, ', ') 'Albums', COUNT(AlbumId) 'Count'FROM Artists arINNER JOIN Албуми alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'pre>Count' DESC;
 Резултат:

+-----------------------+--------------------- -------------------------------------------------- ---------+--------+| Име на изпълнител | Албуми | Брой ||-----------------------+--------------------- -------------------------------------------------- ---------+--------|| Iron Maiden | Powerslave, Някъде във времето, Piece of Mind, Killers, Без молитва за умиращите | 5 || AC/DC | Powerage, обратно в черно, рок или бюст | 3 || Майкъл се научава да рок | Синя нощ, Вечност, Скандинавия | 3 || Девин Таунсенд | Ziltoid Всезнаещият, Жертви на Cool, Epicloud | 3 || Том Джоунс | Отдавна изгубен куфар, хвала и вина, Along Came Jones | 3 || Алън Холдсуърт | Цяла нощ грешна, Шестнадесетте мъже от Тейн | 2 || Бъди Рич | Big Swing Face | 1 || Джим Рийвс | Пеене надолу по алеята | 1 || Сценарият | Няма звук без тишина | 1 |+-----------------------+--------------------- -------------------------------------------------- --------+--------+

МНОГО редове?

COUNT() функцията връща резултата си като int тип данни. Ако имате толкова много редове, че резултатът е по-голям от товаint може да се справи, опитайте COUNT_BIG() вместо това.

COUNT_BIG() работи по същия начин като COUNT() , с изключение на това, че резултатите му се връщат като bigint стойност на типа данни.

Може също да обмислите използването на APPROX_COUNT_DISTINCT() в някои случаи.

APPROX_COUNT_DISTINCT() връща приблизителна стойност, а не точна стойност. Той обаче е проектиран да бъде много по-отзивчив от COUNT() и COUNT_BIG() , така че може да бъде полезно за моменти, когато отзивчивостта е по-важна от прецизността.

Той е проектиран да връща уникални, различни от нулеви стойности, така че би било подходящо само за моменти, когато обикновено използвате DISTINCT клауза с COUNT_BIG() .

Също така имайте предвид, че към момента на писане на APPROX_COUNT_DISTINCT() е в състояние на публичен преглед.


  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 (T-SQL)

  2. списък, разделен със запетая, като единичен низ, T-SQL

  3. Как да изберете данни на таблица от друга база данни в SQL Server?

  4. Защо SQL Server закръглява резултатите от разделянето на две цели числа?

  5. SQL Server SHOWPLAN_ALL