Ayer me encontraba dictando unas asesorías y me han sabido corchar. (No tuve una explicación lógica del funcionamiento de la clausula group by)
Haciendo un análisis entre unos pocos sistemas gestores de bases de datos (postgresql, mysql, access y Oracle) hicimos ciertos ejemplos para determinar el funcionamiento de la clausula group by.
Tabla de prueba:
Código sql:
Ver original
CREATE TABLE transaccion(ticket INTEGER,login INTEGER,profit INTEGER);
Registros de prueba:
Código sql:
Ver original
INSERT INTO transaccion VALUES(2121,20,10000); INSERT INTO transaccion VALUES(2122,20,15000); INSERT INTO transaccion VALUES(2123,20,-15000);
Al tener tanto contacto con mysql, asumí que si esta consulta la agrupaba por login (en este caso 20 en los tres registros) me mostraría un registro. Efectivamente en mysql he obtenido el primer registro de la consulta. Vaya sorpresa que me he llevado cuando ejecutando la misma consulta en los otros 3 SGBD obtengo un error.
El error fue corregido, añadiendo los campos que intervienen en la consulta en el group by.
Hasta este punto, encontré muy lógico lo que estaba pasando. Para postgresql, access y oracle, es muy importante no realizar selecciones arbitrarias de registros que tienen datos repetidos. (Como es el caso del group by por login). En este punto se me genera mi primera duda.. Que factor de selección usa mysql para hacer un agrupamiento? Donde han quedado los otros dos registros si cumplen con las mismas características del primero?
Continuando con las pruebas en los otros gestores y teniendo en cuenta mi análisis inicial
Cita:
si realizo la consulta agrupando por ticket (Todos los registros son diferentes) no debo tener problemas en el agrupamiento.Para postgresql, access y oracle, es muy importante no realizar selecciones arbitrarias de registros que tienen datos repetidos.
Para mi sorpresa, sigue siendo necesario la inclusión de los otros campos en la consulta. Por que se genera esto?
Si tengo una consulta con 50 o 60 campos para mostrar, debo incluir todos los campos en el group by?
En este momento, entendí que realmente no tengo muy claro el concepto de la clausula group by (Aunque me haya salvado de muchas)
Alguien sabe cual es el verdadero funcionamiento de group by??
Mil gracias por su tiempo y disculpen lo engorroso del mensaje.