Najlepsza odpowiedź
W SQL klauzula DISTINCT może być użyta *** przed *** listą wyboru, aby uniknąć zduplikowanych wierszy w wyniku lub *** wewnątrz *** funkcji agregującej, takiej jak COUNT. W drugim przypadku, szczególnie dla COUNT, efektem jest rozważenie powtórzenia wartości tylko raz. Jednym z rozwiązań jest to, że przy konkatenacji zaproponowanej przez Grega Kemnitza, poza niewielkim błędem i dostosowaniami zależnymi od typów kolumn i funkcji łańcuchowych w różnych silnikach sql. , kol3)) FROM table;
Proste rozwiązanie
SELECT COUNT (DISTINCT kol1, kol2, kol3) FROM table;
działa z MySQL, nie pracuję w DB2 i nie znam innych silników, ale nie jest to standardowy SQL.
Kolejne, bardziej skomplikowane rozwiązanie, które może być bardziej efektywne, jeśli operacja jest częsta i odpowiednio zoptymalizowana, wymaga stworzenia widok
UTWÓRZ WIDOK vw AS SELECT DISTINCT kol1, kol2, kol3 GROUP BY kol1, kol2, kol3; SELECT COUNT (*) FROM vw;
Answer
mysql> create table fake (foo tinyint (3) not null default 0, bar varchar (64) not null default „”) ; Zapytanie OK, dotyczy 0 wierszy (0,07 s)
mysql> wstaw do fałszywych wartości (1, „foo”), (1, „bar”), (2, „foo”), (2, „bar”), (3, „baz”), (3, „for”); Zapytanie OK, dotyczy 6 wierszy (0,00 s) Rekordy: 6 Duplikatów: 0 Ostrzeżenia: 0
mysql> wybierz foo, bar, count (*) z fałszywej grupy przez foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | dla | 1 | + —– + —– + ———- + 6 wierszy w zestawie (0,00 sek.)
mysql> wstaw do fałszywych wartości (1, „foo „), (1,” bar „), (2,” foo „), (2,” bar „), (3,” baz „), (3,” for „); Zapytanie OK, dotyczy 6 wierszy (0,00 s) Rekordy: 6 Duplikatów: 0 Ostrzeżenia: 0
mysql> wybierz foo, bar, count (*) z fałszywej grupy przez foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | dla | 2 | + —– + —– + ———- + 6 wierszy w zestawie (0,00 s)
mysql>