Du måste vara försiktig när du använder GROUP BY
. När du förstår vad GROUP BY
gör det kommer du att känna till problemet själv. Den gör en aggregering av dina data eller med andra ord, den minskar din data genom att göra någon operation på råposterna och skapa ett nytt reducerat antal poster på vilka någon aggregeringsfunktion har tillämpats (SUM, COUNT, AVG, etc.)
Fälten du anger i GROUP BY
klausulen representerar nivån av aggregering/roll-up du går efter.
SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
Här försöker du göra aggregeringen på col1
nivå, vilket betyder att för varje distinkt värde som finns i kolumn col1
, kommer det att göras en operation på några andra kolumner som du anger i SELECT
klausul (här col2
,col3
) så att du i utgången har icke-repeterande värden i col1
och några sammanställda värden för col2
och col3
mot varje distinkt col1
värde baserat på vilken funktion du använder (SUM, COUNT, AVG, etc.).
Hur tillämpar du denna funktion? Det är det som saknas i din fråga ovan. För att lösa det måste du använda någon aggregeringsfunktion på fälten som finns i SELECT
sats men inte i GROUP BY
klausul. Ta ett exempel på SUM, prova detta:
SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
ELLER för en bättre idé, ta bort WHERE
filtrera och kontrollera utdata genom att köra:
SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1
Dessutom anledningen till att din andra fråga
SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2
fungerade beror på att du inte behöver tillämpa aggregering på fältet (här col2
) som finns i GROUP BY
klausul.