Musisz być ostrożny używając GROUP BY
. Gdy zrozumiesz, co GROUP BY
tak, sam poznasz problem. Wykonuje agregację na twoich danych lub innymi słowy, redukuje twoje dane, wykonując pewne operacje na surowych wpisach i tworząc nową zmniejszoną liczbę wpisów, na których zastosowano jakąś funkcję agregacji (SUM, COUNT, AVG, itp.)
Pola, które podajesz w GROUP BY
klauzula reprezentuje poziom agregacji/roll-up, do którego dążysz.
SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
Tutaj próbujesz wykonać agregację w col1
poziom, co oznacza, że dla każdej odrębnej wartości znajdującej się w kolumnie col1
, zostanie wykonana pewna operacja na innych kolumnach podanych w SELECT
klauzula(tutaj col2
,col3
) tak, że na wyjściu masz niepowtarzające się wartości w col1
i kilka zebranych wartości col2
i col3
przeciwko każdemu odrębnemu col1
wartość na podstawie zastosowanej funkcji (SUM, COUNT, AVG itp.).
Jak stosujesz tę funkcję? Tego brakuje w powyższym zapytaniu. Aby go rozwiązać, musisz zastosować jakąś funkcję agregacji na polach, które są obecne w SELECT
klauzula, ale nie w GROUP BY
klauzula. Biorąc przykład SUM, wypróbuj to:
SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
LUB dla lepszego pomysłu usunięcie WHERE
filtruj i sprawdzaj wyjście, uruchamiając:
SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1
Dodatkowo, powód, dla którego Twoje inne zapytanie
SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2
zadziałało, ponieważ nie musisz stosować agregacji do pola (tutaj col2
), który jest obecny w GROUP BY
klauzula.