In SQL, come faccio a contare DISTINCT su più colonne?


Migliore risposta

in SQL la clausola DISTINCT può essere utilizzata *** prima *** dellelenco di selezione, per evitare righe duplicate nelloutput o *** allinterno di una funzione di aggregazione, come COUNT. Nel secondo caso, in particolare per COUNT, leffetto è considerare la ripetizione dei valori una sola volta. Una soluzione è quella con la concatenazione proposta da Greg Kemnitz, a parte un piccolo errore e adattamenti dipendenti dai tipi di colonna e dalle funzioni di stringa nei diversi motori sql

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

La soluzione facile

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

funziona con MySQL, non funziona in DB2 e non conosco altri motori, ma non è SQL standard.

Unaltra soluzione più complicata, che può essere più efficace se loperazione è frequente e adeguatamente ottimizzata, richiede la creazione di una vista

CREA VISTA vw AS 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 “”) ; Query OK, 0 righe interessate (0,07 sec)

mysql> inserire in valori falsi (1, “foo”), (1, “bar”), (2, “foo”), (2, “bar”), (3, “baz”), (3, “for”); Query OK, 6 righe interessate (0.00 sec) Record: 6 Duplicati: 0 Avvisi: 0

mysql> seleziona foo, bar, count (*) da fake group by foo, bar; + —– + —– + ———- + | foo | bar | conteggio (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | per | 1 | + —– + —– + ———- + 6 righe nel set (0.00 sec)

mysql> inserisci in valori falsi (1, “pippo “), (1,” bar “), (2,” foo “), (2,” bar “), (3,” baz “), (3,” for “); Query OK, 6 righe interessate (0.00 sec) Record: 6 Duplicati: 0 Avvisi: 0

mysql> seleziona foo, bar, count (*) da fake group by foo, bar; + —– + —– + ———- + | foo | bar | conteggio (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | per | 2 | + —– + —– + ———- + 6 righe nel set (0,00 sec)

mysql>

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *