Lo que tienes es errado el concepto de GROUP BY.
Estás pensando en que el agrupamiento es el hecho de que los registros con similitudes en ciertas columnas aparezcan juntos en la tabla.
Eso no es agrupamiento, sino
ordenamiento.
El ORDER BY acomoda los registros para que aparezcan ordenados alfabéticamente en forma ascendente o descendente, según el conjunto indicado de campos a considerar. Esto significa que si se han indicado los campos a, b, c, y d en el ORDER BY, primero ordena todos los registros según el campo a, cada conjunto de campos de igual contenido, los ordena según el campo b, y luego cada par a+b por el campo c y finalmente por el campo d.
Un orden de ese tipo sería:
Cita: ---------------
a | b | c | d
---------------
1 | 1 | 1 | 1
1 | 1 | 1 | 2
1 | 1 | 2 | 3
1 | 2 | 3 | 4
2 | 3 | 4 | 5
2 | 3 | 5 | 5
2 | 3 | 5 | 7
--------------
En cambio el GROUP BY lo que hace es mostrar sólo el primero de los registros que cumple con el agrupamiento, y "esconder" los otros por detrás. El sentido de esto es, por ejemplo, permitir discriminar los ejemplos de grupos distintos, y realizar operaciones matemáticas con el grupo que cumple con el agrupamiento y que debe realizarse por subgrupo. Como la operación tiene sentido sólo si se considera como valor único para todo el grupo, ese valor se representa junto con el conjunto de campos que lo identifica.
Ese sería el caso, por ejemplo, de hacer el cálculo de cuantos registros hay con el mismo par de datos a y b que sean iguales:
Cita: ---------------
a | b | subtotal
---------------
1 | 1 | 3
1 | 2 | 1
2 | 3 | 3
--------------
Precisamente por eso, el uso de una función agregada (AVG(), SUM(), MIN(), MAX()), sólo se admite si está presente la cláusula GROUP BY, a menos que las funciones sean lo único que aparece en el SELECT:
Código sql:
Ver originalSELECT COUNT(*)
FROM TABLA;
SELECT AVG(CAMPO1)
FROM TABLA;
SELECT SUM(CAMPO1), MAX(CAMPO2), MIN(CAMPO3), AVG(CAMPO4)
FROM TABLA;
¿Se va entendiendo la idea?