Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/09/2012, 13:55
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: GROUP BY en la siguiente consulta

Hola computer_si:

Con permiso de quimfv, meto mi cuchara en el post:

Código:
Cundo utilizas GROUP BY tambien los tienes que mencionar a exepcion 
de los calculados como el SUM, COUNT, Etc.
No necesariamente... algunos otros DBMS como SQL Server y ORACLE te exigen colocar en el GROUP BY todos aquellos campos que listas en el SELECT y que no estén incluidos en una función de agrupación, sin embargo MySQL te permite omitirlos, sin embargo tiene un comportamiento especial que trataré de explicar con este script, supongamos que tenemos estos datos

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +-------------+--------+--------+
  3. | descripcion | campo1 | campo2 |
  4. +-------------+--------+--------+
  5. | uno         |      1 |      1 |
  6. | uno         |      2 |      2 |
  7. | uno         |      3 |      3 |
  8. | dos         |      2 |      2 |
  9. | dos         |      1 |      3 |
  10. | dos         |      3 |      1 |
  11. | tres        |      3 |      1 |
  12. | tres        |      2 |      2 |
  13. | tres        |      1 |      3 |
  14. +-------------+--------+--------+
  15. 9 rows in set (0.00 sec)

Observa qué es lo que muestra cada uno de los distintos "acomodos" de los campos:


Código MySQL:
Ver original
  1. mysql> SELECT descripcion, campo1, campo2 FROM tabla
  2.     -> GROUP BY descripcion;
  3. +-------------+--------+--------+
  4. | descripcion | campo1 | campo2 |
  5. +-------------+--------+--------+
  6. | dos         |      2 |      2 |
  7. | tres        |      3 |      1 |
  8. | uno         |      1 |      1 |
  9. +-------------+--------+--------+
  10. 3 rows in set (0.00 sec)

muestra la primer aparición de los campos 1 y 2 para cada categoría que se están agrupando.

Código MySQL:
Ver original
  1. mysql> SELECT descripcion, campo1, MIN(campo2) FROM tabla
  2.     -> GROUP BY descripcion;
  3. +-------------+--------+-------------+
  4. | descripcion | campo1 | MIN(campo2) |
  5. +-------------+--------+-------------+
  6. | dos         |      2 |           1 |
  7. | tres        |      3 |           1 |
  8. | uno         |      1 |           1 |
  9. +-------------+--------+-------------+
  10. 3 rows in set (0.00 sec)

Para el caso de los campos que se incluyen en el SELECT, pero que no se incluyen en el GROUP BY como el campo 1 te muestra la primer aparición, independientemente del valor que le corresponda en al campo 2

Código MySQL:
Ver original
  1. mysql> SELECT descripcion, MIN(campo1), MIN(campo2) FROM tabla
  2.     -> GROUP BY descripcion;
  3. +-------------+-------------+-------------+
  4. | descripcion | MIN(campo1) | MIN(campo2) |
  5. +-------------+-------------+-------------+
  6. | dos         |           1 |           1 |
  7. | tres        |           1 |           1 |
  8. | uno         |           1 |           1 |
  9. +-------------+-------------+-------------+
  10. 3 rows in set (0.00 sec)

Aquí creo que no hay problema con la utilización.

Código MySQL:
Ver original
  1. mysql> SELECT descripcion, campo1, MIN(campo2) FROM tabla
  2.     -> GROUP BY descripcion, campo1;
  3. +-------------+--------+-------------+
  4. | descripcion | campo1 | MIN(campo2) |
  5. +-------------+--------+-------------+
  6. | dos         |      1 |           3 |
  7. | dos         |      2 |           2 |
  8. | dos         |      3 |           1 |
  9. | tres        |      1 |           3 |
  10. | tres        |      2 |           2 |
  11. | tres        |      3 |           1 |
  12. | uno         |      1 |           1 |
  13. | uno         |      2 |           2 |
  14. | uno         |      3 |           3 |
  15. +-------------+--------+-------------+
  16. 9 rows in set (0.00 sec)

Observa que al incluir el campo 2 en el GROUP BY aquí si se considera para hacer los cortes en las agrupaciones.

Saludos
Leo.