Ao usar o
count()
função no SQLite, você pode se encontrar na situação em que deseja apenas contar valores distintos. Ou seja, você não deseja que valores duplicados sejam contados várias vezes. Em outras palavras, se a coluna tiver o mesmo valor várias vezes, ela deverá contar esse valor apenas uma vez.
Por padrão,
count()
incluirá todos os valores duplicados em seu cálculo. Por exemplo, se o valor “Cat” aparecer 3 vezes, count()
vai contar como 3. No entanto, se você deseja apenas que valores distintos sejam contados,
count()
contaria como 1. Felizmente, existe uma maneira fácil de fazer isso. Tudo o que você precisa fazer é adicionar o
DISTINCT
palavra-chave para o seu count()
função. Assim:count(DISTINCT x)
Onde
x
é o nome da coluna para qual conteúdo você está contando (ou a linha inteira se você estiver usando o curinga asterisco). Exemplo
Pegue a seguinte tabela:
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
Observe que as linhas 2 a 4 têm o mesmo preço (10,0).
Se eu fizer um
count()
normal no Preço coluna, ele contará todas as seis linhas. SELECT count(Price) FROM Products;
Resultado:
6
No entanto, se eu adicionar o
DISTINCT
palavra-chave, ele contará essas três linhas como uma. SELECT count(DISTINCT Price) FROM Products;
Resultado:
4
Contar linhas distintas
O
count()
aceita o curinga asterisco (*
), o que significa que ele contará todas as linhas. No entanto, você provavelmente receberá um erro se tentar usar
DISTINCT
ao usar o curinga asterisco. Aqui está uma tabela com linhas duplicadas.
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
Em teoria, eu deveria ser capaz de usar
DISTINCT
para contar as linhas “desduplicadas” nesta tabela. No entanto, isso não parece possível. SELECT count(DISTINCT *)
FROM States;
Resultado:
Error: near "*": syntax error
Em vez disso, preciso especificar um nome de coluna ao usar o
DISTINCT
palavra-chave. SELECT
count(State),
count(DISTINCT State)
FROM States;
Resultado:
count(State) count(DISTINCT State) ------------ --------------------- 7 6
Outra maneira de fazer isso seria fazer algo assim:
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
Resultado:
6
No entanto, isso não deve ser um problema, pois geralmente não é um bom design de banco de dados permitir linhas duplicadas como essa.