Du skal være forsigtig, når du bruger GROUP BY
. Når du forstår, hvad GROUP BY
gør, vil du selv kende problemet. Den foretager en aggregering på dine data, eller med andre ord, den reducerer dine data ved at udføre en eller anden handling på de rå poster og skabe et nyt reduceret antal poster, som en eller anden aggregeringsfunktion er blevet anvendt på (SUM, COUNT, AVG osv.)
De felter, du angiver i GROUP BY
klausul repræsenterer niveauet af aggregering/oprulning, du går efter.
SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
Her forsøger du at lave aggregeringen ved col1
niveau, hvilket betyder, at for hver enkelt værdi, der findes i kolonne col1
, vil der blive udført en operation på nogle andre kolonner, du angiver i SELECT
klausul(her col2
,col3
), så du i outputtet har ikke-gentagende værdier i col1
og nogle oprullede værdier af col2
og col3
mod hver enkelt col1
værdi baseret på hvilken funktion du anvender (SUM, COUNT, AVG osv.).
Hvordan anvender du denne funktion? Det er det, der mangler i din ovenstående forespørgsel. For at løse det skal du anvende en eller anden aggregeringsfunktion på de felter, der er til stede i SELECT
klausul, men ikke i GROUP BY
klausul. Tag et eksempel på SUM, prøv dette:
SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
ELLER for en bedre idé, fjern WHERE
filter og kontroller outputtet ved at køre:
SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1
Derudover grunden til, at din anden forespørgsel
SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2
fungerede, fordi du ikke behøver anvende aggregering på feltet (her col2
), som er til stede i GROUP BY
klausul.