Hoe tel ik in SQL DISTINCT over meerdere kolommen?


Beste antwoord

in SQL kan de DISTINCT-clausule *** vóór *** de selectielijst worden gebruikt, om dubbele rijen in de uitvoer te vermijden of *** binnen *** een aggregatiefunctie, zoals COUNT. In het tweede geval, met name voor COUNT, is het effect dat wordt overwogen waarden slechts één keer te herhalen. Een oplossing is dat met de aaneenschakeling voorgesteld door Greg Kemnitz, afgezien van een kleine fout en aanpassingen afhankelijk van kolomtypen en stringfuncties in de verschillende sql-engines.

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

De gemakkelijke oplossing

SELECTEER AANTAL (DISTINCT col1, col2, col3) FROM table;

werkt met MySQL, niet werk in DB2 en ik weet niets van andere engines, maar het is geen standaard SQL.

Een andere, meer gecompliceerde oplossing, die effectiever kan zijn als de bewerking frequent is en voldoende geoptimaliseerd, vereist het maken van a view

CREATE VIEW vw AS SELECTEER DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; SELECTEER AANTAL (*) VAN vw;

Antwoord

mysql> maak tafel nep (foo tinyint (3) niet nul standaard 0, bar varchar (64) niet nul standaard “”) ; Query OK, 0 rijen beïnvloed (0,07 sec)

mysql> invoegen in nepwaarden (1, “foo”), (1, “bar”), (2, “foo”), (2, “bar”), (3, “baz”), (3, “for”); Query OK, 6 rijen beïnvloed (0.00 sec) Records: 6 Duplicaten: 0 Waarschuwingen: 0

mysql> selecteer foo, bar, count (*) van nepgroep door foo, bar; + —– + —– + ———- + | foo | bar | tellen (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | voor | 1 | + —– + —– + ———- + 6 rijen in set (0.00 sec)

mysql> invoegen in nepwaarden (1, “foo “), (1,” bar “), (2,” foo “), (2,” bar “), (3,” baz “), (3,” for “); Query OK, 6 rijen beïnvloed (0.00 sec) Records: 6 Duplicaten: 0 Waarschuwingen: 0

mysql> selecteer foo, bar, count (*) van nepgroep door foo, bar; + —– + —– + ———- + | foo | bar | tellen (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | voor | 2 | + —– + —– + ———- + 6 rijen in set (0.00 sec)

mysql>

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *