Em SQL, como faço para contar DISTINCT em várias colunas?


Melhor resposta

em SQL, a cláusula DISTINCT pode ser usada *** antes *** da lista de seleção, para evitar linhas duplicadas na saída ou *** dentro de *** uma função de agregação, como COUNT. No segundo caso, em particular para COUNT, o efeito é considerar a repetição de valores apenas uma vez. Uma solução é que com a concatenação proposta por Greg Kemnitz, além de um pequeno erro e adaptações dependendo dos tipos de coluna e funções de string nos diferentes motores sql

SELECT COUNT (DISTINCT CONCAT (col1, …. , col3)) FROM tabela;

A solução fácil

SELECT COUNT (DISTINCT col1, col2, col3) FROM tabela;

funciona com MySQL, não trabalho no DB2 e não sei sobre outros engines, mas não é SQL padrão.

Outra solução mais complicada, que pode ser mais eficaz se a operação for frequente e adequadamente otimizada, requer a criação de uma visão

CRIAR VISUALIZAÇÃO vw AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; SELECT COUNT (*) FROM vw;

Resposta

mysql> criar tabela falsa (foo tinyint (3) não nulo padrão 0, bar varchar (64) não nulo padrão “”) ; Consulta OK, 0 linhas afetadas (0,07 seg)

mysql> inserir em valores falsos (1, “foo”), (1, “bar”), (2, “foo”), (2, “bar”), (3, “baz”), (3, “para”); Consulta OK, 6 linhas afetadas (0,00 seg) Registros: 6 Duplicatas: 0 Avisos: 0

mysql> selecione foo, bar, count (*) do grupo falso por foo, bar; + —– + —– + ———- + | foo | bar | contagem (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | para | 1 | + —– + —– + ———- + 6 linhas em conjunto (0,00 s)

mysql> inserir em valores falsos (1, “foo “), (1,” bar “), (2,” foo “), (2,” bar “), (3,” baz “), (3,” para “); Consulta OK, 6 linhas afetadas (0,00 seg) Registros: 6 duplicatas: 0 Avisos: 0

mysql> selecione foo, bar, count (*) do grupo falso por foo, bar; + —– + —– + ———- + | foo | bar | contagem (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | para | 2 | + —– + —– + ———- + 6 linhas no conjunto (0,00 s)

mysql>

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *