Когато използвате count()
функция в SQLite, може да се окажете в ситуация, в която искате да броите само различни стойности. Това означава, че не искате дублиращи се стойности да се броят няколко пъти.
С други думи, ако колоната има една и съща стойност няколко пъти, тя трябва да отчита тази стойност само веднъж.
По подразбиране count()
ще включи всички дублиращи се стойности в своето изчисление. Например, ако стойността “Cat” се появи 3 пъти, count()
ще отчита това за 3.
Ако обаче искате да се отчитат само различни стойности, тогава count()
ще го брои за 1.
За щастие има лесен начин да направите това. Всичко, което трябва да направите, е да добавите DISTINCT
ключова дума към вашия count()
функция. Като това:
count(DISTINCT x)
Където x
е името на колоната, чието съдържание броите (или целия ред, ако използвате заместващия знак звездичка).
Пример
Вземете следната таблица:
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
Забележете, че всички редове от 2 до 4 имат една и съща цена (10.0).
Ако направя нормален count()
на Цена колона, ще преброи всичките шест реда.
SELECT count(Price) FROM Products;
Резултат:
6
Въпреки това, ако добавя DISTINCT
ключова дума, тя ще отчита тези три реда като един.
SELECT count(DISTINCT Price) FROM Products;
Резултат:
4
Преброяване на отделни редове
count()
функцията приема заместващия знак звездичка (*
), което означава, че ще брои всички редове.
Вероятно обаче ще получите грешка, ако се опитате да използвате DISTINCT
когато използвате заместващия знак за звездичка.
Ето таблица с дублиращи се редове.
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
На теория би трябвало да мога да използвам DISTINCT
за да преброите „де-дупираните“ редове в тази таблица. Това обаче не изглежда възможно.
SELECT count(DISTINCT *)
FROM States;
Резултат:
Error: near "*": syntax error
Вместо това трябва да посоча име на колона, когато използвам DISTINCT
ключова дума.
SELECT
count(State),
count(DISTINCT State)
FROM States;
Резултат:
count(State) count(DISTINCT State) ------------ --------------------- 7 6
Друг начин да го направите е да направите нещо подобно:
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
Резултат:
6
Това всъщност не би трябвало да е проблем, тъй като обикновено не е добър дизайн на базата данни да позволява дублиране на редове като този.