Mysql
 sql >> Database >  >> RDS >> Mysql

La query con GROUP BY e ORDER BY non funziona quando vengono scelte più colonne in SELECT

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.