Při použití count()
funkce v SQLite, můžete se dostat do situace, kdy chcete počítat pouze odlišné hodnoty. To znamená, že nechcete, aby se duplicitní hodnoty započítávaly vícekrát.
Jinými slovy, pokud má sloupec stejnou hodnotu vícekrát, měl by tuto hodnotu počítat pouze jednou.
Ve výchozím nastavení count()
zahrne do výpočtu všechny duplicitní hodnoty. Pokud se například hodnota „Cat“ objeví třikrát, count()
bude to počítat jako 3.
Pokud však chcete, aby se počítaly pouze odlišné hodnoty, pak count()
by to započítalo jako 1.
Naštěstí existuje snadný způsob, jak to udělat. Vše, co musíte udělat, je přidat DISTINCT
klíčového slova na váš count()
funkce. Takhle:
count(DISTINCT x)
Kde x
je název sloupce, jehož obsah počítáte (nebo celý řádek, pokud používáte zástupný znak hvězdička).
Příklad
Vezměte si následující tabulku:
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
Všimněte si, že všechny řádky 2 až 4 mají stejnou cenu (10,0).
Pokud udělám normální count()
na ceně sloupec, bude počítat všech šest řádků.
SELECT count(Price) FROM Products;
Výsledek:
6
Pokud však přidám DISTINCT
klíčové slovo, započítá tyto tři řádky jako jeden.
SELECT count(DISTINCT Price) FROM Products;
Výsledek:
4
Počítání odlišných řádků
count()
funkce přijímá zástupný znak hvězdičky (*
), což znamená, že bude počítat všechny řádky.
Pokud se však pokusíte použít DISTINCT
, pravděpodobně se zobrazí chyba při použití zástupného znaku hvězdička.
Zde je tabulka s duplicitními řádky.
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
Teoreticky bych měl být schopen používat DISTINCT
k počítání „deduplikovaných“ řádků v této tabulce. Zdá se však, že to není možné.
SELECT count(DISTINCT *)
FROM States;
Výsledek:
Error: near "*": syntax error
Místo toho musím při použití DISTINCT
zadat název sloupce klíčové slovo.
SELECT
count(State),
count(DISTINCT State)
FROM States;
Výsledek:
count(State) count(DISTINCT State) ------------ --------------------- 7 6
Dalším způsobem, jak to udělat, by bylo udělat něco takového:
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
Výsledek:
6
To by však ve skutečnosti neměl být problém, protože obecně není dobrý návrh databáze, který umožňuje duplicitní řádky, jako je tento.