Devi stare attento quando usi GROUP BY
. Una volta capito cosa GROUP BY
lo fa, conoscerai tu stesso il problema. Fa un'aggregazione sui tuoi dati o in altre parole riduce i tuoi dati facendo qualche operazione sulle voci grezze e creando un nuovo numero ridotto di voci su cui è stata applicata qualche funzione di aggregazione (SUM, COUNT, AVG, ecc.)
I campi che fornisci nel GROUP BY
La clausola rappresenta il livello di aggregazione/roll-up che stai cercando.
SELECT col2, col3 FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
Qui stai provando a fare l'aggregazione in col1
level, ovvero per ogni valore distinto presente nella colonna col1
, verranno eseguite alcune operazioni su alcune altre colonne fornite in SELECT
clausola(qui col2
,col3
) in modo che nell'output siano presenti valori non ripetuti in col1
e alcuni valori cumulativi di col2
e col3
contro ogni distinto col1
valore in base alla funzione applicata (SUM, COUNT, AVG, ecc.).
Come si applica questa funzione? Questo è ciò che manca nella tua query di cui sopra. Per risolverlo è necessario applicare delle funzioni di aggregazione sui campi presenti nel SELECT
clausola ma non in GROUP BY
clausola. Prendendo un esempio di SUM, prova questo:
SELECT SUM(col2), SUM(col3) FROM tbl WHERE col1 IS NULL GROUP BY col1 ORDER BY col1
O per un'idea migliore, rimuovendo WHERE
filtrare e controllare l'output eseguendo:
SELECT col1, SUM(col2), SUM(col3) FROM tbl GROUP BY col1 ORDER BY col1
Inoltre, il motivo per cui l'altra tua domanda
SELECT col2 FROM tbl WHERE col1 IS NULL GROUP BY col2 ORDER BY col2
lavorato è perché non è necessario applicare l'aggregazione al campo (qui col2
) che è presente nel GROUP BY
clausola.