Hvordan tæller jeg DISTINCT over flere kolonner i SQL?


Bedste svar

i SQL kan DISTINCT-klausulen bruges *** før *** på listen, for at undgå duplikerede rækker i output eller *** inde i *** en aggregeringsfunktion, såsom COUNT. I det andet tilfælde, især for COUNT, er effekten kun at overveje at gentage værdier en gang. En løsning er, at med sammenkædningen foreslået af Greg Kemnitz bortset fra en lille fejl og tilpasninger afhængigt af kolonnetyper og strengfunktioner i de forskellige sql-motorer

VÆLG TÆLL (DISTINCT CONCAT (col1, …. , col3)) FROM-tabel;

Den nemme løsning

VÆLG TÆLL (DISTINCT col1, col2, col3) FRA-tabel;

fungerer med MySQL, fungerer ikke arbejde i DB2, og jeg kender ikke til andre motorer, men det er ikke standard SQL.

En anden, mere kompliceret løsning, som kan være mere effektiv, hvis operationen er hyppig og tilstrækkelig optimeret, kræver oprettelse af en visning

CREATE VIEW vw AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; VÆLG TÆLL (*) FRA vw;

Svar

mysql> Opret tabel falsk (foo tinyint (3) ikke null standard 0, bar varchar (64) ikke null standard “”) ; Forespørgsel OK, 0 rækker berørt (0,07 sek)

mysql> indsæt i falske værdier (1, “foo”), (1, “bar”), (2, “foo”), (2, “bar”), (3, “baz”), (3, “for”); Forespørgsel OK, 6 rækker berørt (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0

mysql> vælg foo, bar, count (*) fra falsk gruppe efter foo, bar; + —– + —– + ———- + | foo | bar | tælle (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | til | 1 | + —– + —– + ———- + 6 rækker i sæt (0,00 sek)

mysql> indsæt i falske værdier (1, “foo “), (1,” bar “), (2,” foo “), (2,” bar “), (3,” baz “), (3,” for “); Forespørgsel OK, 6 rækker berørt (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0

mysql> vælg foo, bar, count (*) fra falsk gruppe efter foo, bar; + —– + —– + ———- + | foo | bar | tælle (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | til | 2 | + —– + —– + ———- + 6 rækker i sæt (0,00 sek)

mysql>

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *