Mejor respuesta
En SQL, la cláusula DISTINCT se puede usar *** antes *** de la lista de selección, para evitar filas duplicadas en la salida o *** dentro de *** una función de agregación, como COUNT. En el segundo caso, en particular para COUNT, el efecto es considerar la repetición de valores solo una vez. Una solución es que con la concatenación propuesta por Greg Kemnitz, además de un pequeño error y adaptaciones en función de tipos de columna y funciones de cadena en los diferentes motores sql
SELECT COUNT (DISTINCT CONCAT (col1, …. , col3)) FROM table;
La solución fácil
SELECT COUNT (DISTINCT col1, col2, col3) FROM table;
funciona con MySQL, no trabajo en DB2 y no conozco otros motores, pero no es SQL estándar.
Otra solución más complicada, que puede ser más efectiva si la operación es frecuente y adecuadamente optimizada, requiere la creación de una vista
CREAR VISTA vw COMO SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; SELECT COUNT (*) FROM vw;
Answer
mysql> create table fake (foo tinyint (3) not null default 0, bar varchar (64) not null default «») ; Consulta OK, 0 filas afectadas (0.07 seg)
mysql> insertar en valores falsos (1, «foo»), (1, «bar»), (2, «foo»), (2, «barra»), (3, «baz»), (3, «para»); Consulta OK, 6 filas afectadas (0.00 seg) Registros: 6 Duplicados: 0 Advertencias: 0
mysql> seleccione foo, bar, count (*) del grupo falso por foo, bar; + —– + —– + ———- + | foo | bar | contar (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | para | 1 | + —– + —– + ———- + 6 filas en conjunto (0.00 seg)
mysql> insertar en valores falsos (1, «foo «), (1,» barra «), (2,» foo «), (2,» barra «), (3,» baz «), (3,» para «); Consulta OK, 6 filas afectadas (0.00 seg) Registros: 6 Duplicados: 0 Advertencias: 0
mysql> seleccione foo, bar, count (*) del grupo falso por foo, bar; + —– + —– + ———- + | foo | bar | contar (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | para | 2 | + —– + —– + ———- + 6 filas en conjunto (0.00 seg)
mysql>