En SQL, ¿cómo cuento DISTINCT en varias columnas?


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>

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *