Używając count()
funkcji w SQLite, możesz znaleźć się w sytuacji, w której chcesz liczyć tylko różne wartości. Oznacza to, że nie chcesz, aby zduplikowane wartości były liczone wielokrotnie.
Innymi słowy, jeśli kolumna ma tę samą wartość wiele razy, powinna policzyć tę wartość tylko raz.
Domyślnie count()
uwzględni w swoich obliczeniach wszystkie zduplikowane wartości. Na przykład, jeśli wartość „Kot” pojawi się 3 razy, count()
policzy to jako 3.
Jeśli jednak chcesz, aby były liczone tylko różne wartości, wtedy count()
policzyłoby to jako 1.
Na szczęście jest na to prosty sposób. Wszystko, co musisz zrobić, to dodać DISTINCT
słowo kluczowe do Twojego count()
funkcjonować. Tak:
count(DISTINCT x)
Gdzie x
to nazwa kolumny, dla której liczysz zawartość (lub cały wiersz, jeśli używasz symbolu wieloznacznego gwiazdki).
Przykład
Weź poniższą tabelę:
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
Zauważ, że wszystkie wiersze od 2 do 4 mają tę samą cenę (10,0).
Jeśli wykonam normalne count()
w Cenie kolumna, policzy wszystkie sześć wierszy.
SELECT count(Price) FROM Products;
Wynik:
6
Jeśli jednak dodam DISTINCT
słowo kluczowe, zliczy te trzy wiersze jako jeden.
SELECT count(DISTINCT Price) FROM Products;
Wynik:
4
Policz odrębne wiersze
count()
funkcja akceptuje symbol wieloznaczny gwiazdki (*
), co oznacza, że policzy wszystkie wiersze.
Jednak prawdopodobnie wystąpi błąd, jeśli spróbujesz użyć DISTINCT
podczas używania symbolu wieloznacznego gwiazdki.
Oto tabela ze zduplikowanymi wierszami.
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
Teoretycznie powinienem być w stanie użyć DISTINCT
aby policzyć wiersze „zdeduplikowane” w tej tabeli. Jednak wydaje się to niemożliwe.
SELECT count(DISTINCT *)
FROM States;
Wynik:
Error: near "*": syntax error
Zamiast tego muszę określić nazwę kolumny podczas korzystania z DISTINCT
słowo kluczowe.
SELECT
count(State),
count(DISTINCT State)
FROM States;
Wynik:
count(State) count(DISTINCT State) ------------ --------------------- 7 6
Innym sposobem na to byłoby zrobienie czegoś takiego:
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
Wynik:
6
Nie powinno to jednak stanowić problemu, ponieważ generalnie nie jest dobrym projektem bazy danych zezwalanie na duplikowanie wierszy w ten sposób.