În SQL, cum pot număra DISTINCT pe mai multe coloane?


Cel mai bun răspuns

în SQL clauza DISTINCT poate fi utilizată *** înainte de *** lista de selectare, pentru a evita rândurile duplicate în ieșire sau *** în interiorul *** o funcție de agregare, cum ar fi COUNT. În al doilea caz, în special pentru COUNT, efectul este de a lua în considerare repetarea valorilor o singură dată. O soluție este aceea cu concatenarea propusă de Greg Kemnitz, în afară de o mică greșeală și adaptări în funcție de tipurile de coloane și funcțiile șirurilor din diferitele motoare sql

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

Soluția ușoară

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

funcționează cu MySQL, nu funcționează în DB2 și nu știu despre alte motoare, dar nu este SQL standard.

O altă soluție mai complicată, care poate fi mai eficientă dacă operația este frecventă și optimizată în mod adecvat, necesită crearea de o vizualizare

CREATE VIEW vw AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; SELECT COUNT (*) FROM vw;

Răspunde

mysql> creează tabel fals (foo tinyint (3) nu nul implicit 0, bar varchar (64) nu nul implicit „”) ; Interogare OK, 0 rânduri afectate (0,07 sec)

mysql> inserare în valori false (1, „foo”), (1, „bar”), (2, „foo”), (2, „bar”), (3, „baz”), (3, „pentru”); Interogare OK, 6 rânduri afectate (0,00 sec) Înregistrări: 6 Duplicate: 0 Avertismente: 0

mysql> selectați foo, bar, count (*) din grupul fals de foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | pentru | 1 | + —– + —– + ———- + 6 rânduri în set (0,00 sec)

mysql> inserare în valori false (1, „foo „), (1,” bar „), (2,” foo „), (2,” bar „), (3,” baz „), (3,” pentru „); Interogare OK, 6 rânduri afectate (0,00 sec) Înregistrări: 6 Duplicate: 0 Avertismente: 0

mysql> selectați foo, bar, count (*) din grupul fals de foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | pentru | 2 | + —– + —– + ———- + 6 rânduri în set (0,00 sec)

mysql>

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *