Ver Mensaje Individual
  #6 (permalink)  
Antiguo 09/12/2010, 07:37
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 3 meses
Puntos: 360
Respuesta: Omitir valores repetidos sql

Hola anayazti

La clausula group by tiene un funcionamiento particular en mysql. Alguna vez tuve una duda acerca de su funcionamiento que expuse en este tema.

En resumen... Aunque mysql aplicando el comando ONLY_FULL_GROUP_BY responde al comportamiento correcto del group by para cualquier DBMS, la razón por la que es necesario incluir todos los campos que se expongan en la consulta como parte del group by es por que se necesita un criterio para excluir los registros que aparentemente son iguales.

Te lo explico con un ejemplo entre mysql y postgresql.

tenemos una tabla llamada empleado con id,nombre y departamento al que pertenece.

En postgresql sería:

Código SQL:
Ver original
  1. pruebas=> CREATE TABLE empleado(id INTEGER,nombre TEXT,depto TEXT);
  2. CREATE TABLE
  3. pruebas=> INSERT INTO empleado VALUES(1,'DANIEL','SISTEMAS');
  4. INSERT 0 1
  5. pruebas=> INSERT INTO empleado VALUES(2,'MONICA','BIOLOGIA');
  6. INSERT 0 1
  7. pruebas=> INSERT INTO empleado VALUES(2,'MONICA','BIOLOGIA');
  8. INSERT 0 1
  9. pruebas=> SELECT *FROM empleado GROUP BY depto;
  10. ERROR:  COLUMN "empleado.id" must appear IN the GROUP BY clause OR be used IN an aggregate FUNCTION

Fijate que el error dice que es totalmente necesario incluir en la clausula group by el campo id.

Ahora miremos en mysql.

Código MySQL:
Ver original
  1. mysql> CREATE TABLE empleado(id INTEGER,nombre TEXT,depto TEXT);
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> INSERT INTO empleado VALUES(1,'DANIEL','SISTEMAS');
  5. Query OK, 1 row affected (0.00 sec)
  6.  
  7. mysql> INSERT INTO empleado VALUES(2,'MONICA','BIOLOGIA');
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> INSERT INTO empleado VALUES(3,'SANTIAGO','SISTEMAS');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> SELECT *FROM empleado GROUP BY depto;
  14. +------+--------+----------+
  15. | id   | nombre | depto    |
  16. +------+--------+----------+
  17. |    2 | MONICA | BIOLOGIA |
  18. |    1 | DANIEL | SISTEMAS |
  19. +------+--------+----------+
  20. 2 rows in set (0.03 sec)

Supuestamente a agrupado correctamente la misma consulta.

La pregunta que se genera es: Con que criterio mysql ha mostrado el nombre DANIEL y no SANTIAGO? que criterio a tenido para rechazar este registro aunque cumpla todas las condiciones de la consulta?

Por el lado de postgresql (También Oracle, DB2 etc.) la inclusión de este campo es necesaria ya que si no cuenta con un criterio valido para la agrupación, al detectarlo genera error.

Leonardo_josue y tampon se preguntarán... esto que tiene que ver con el tema?
anayazti me ha solicitado ayuda mediante mensaje privado una explicación del como funciona el group by y la razón por la que no obtiene los resultados esperados.

El verdadero potencial del group by no es para exclusión de registros sino para el manejo de funciones de agrupación como MAX,MIN,SUM,AVG etc.

anayazti si nos compartes tus tablas clientes y nota (CREATE TABLE clientes....ETC) y algunos registros de prueba (INSERT INTO clientes VALUES....ETC) tal vez te podamos ayudar con la salida que quieras mostrar.

saludos a todos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming