Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Duda con group by

Estas en el tema de Duda con group by en el foro de Bases de Datos General en Foros del Web. Buenas Foro 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) ...
  #1 (permalink)  
Antiguo 11/05/2009, 07:56
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Duda con group by

Buenas Foro

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
  1. CREATE TABLE transaccion(ticket INTEGER,login INTEGER,profit INTEGER);

Registros de prueba:
Código sql:
Ver original
  1. INSERT INTO transaccion VALUES(2121,20,10000);
  2. INSERT INTO transaccion VALUES(2122,20,15000);
  3. 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:
Para postgresql, access y oracle, es muy importante no realizar selecciones arbitrarias de registros que tienen datos repetidos.
si realizo la consulta agrupando por ticket (Todos los registros son diferentes) no debo tener problemas en el agrupamiento.

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.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 11/05/2009 a las 08:14
  #2 (permalink)  
Antiguo 11/05/2009, 08:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Duda con group by

huesos52,

¿has visto esto?
http://dev.mysql.com/tech-resources/...-by-myths.html
  #3 (permalink)  
Antiguo 11/05/2009, 09:17
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Duda con group by

Que interesante articulo jurena, nunca lo había visto.
Lo leeré con bastante cuidado. Estoy seguro que me aclarará muchas de mis dudas.

Muchas gracias jurena.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 11/05/2009, 10:59
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Duda con group by

Excelente articulo.

mysql despues de aplicar el ONLY_FULL_GROUP_BY se comporta exactamente igual a los otros RDBMS.

Sin embargo, no me explico por que razón en los RDBMS mencionados no se puede hacer una agrupación por un campo sin registros repetidos sin la necesidad de incluir los otros campos en la agrupación.

Si para el ejemplo, el campo de agrupación fuera ticket y asumiendo que sea un PK, tendría
que mostrar todos y cada uno de los registros sin depender de los otros campos llamados en la consulta.

Por que serán necesarios en el group by?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 11/05/2009, 11:14
Avatar de Thumper  
Fecha de Ingreso: agosto-2004
Ubicación: Jesús María - Lima - Perú
Mensajes: 270
Antigüedad: 20 años, 2 meses
Puntos: 6
Respuesta: Duda con group by

Usualmente el GROUP BY lo uso cuando voy a obtener algun valor calculado por varios registros por ejemplo:

declare @table table( intid int, varnombre varchar(100), intedad int, inttipo int)
insert into @table values( 1, 'hugo', 10, 1)
insert into @table values( 2, 'paco', 20, 2)
insert into @table values( 3, 'luis', 30, 1)

-- Por ejemplo si deseo obtener el promedio de edad de cada tipo ( inttipo ) uso:

select inttipo, promedio = avg(intedad)
from @table
group by inttipo

-- Ahora si debo de mostrar todos los campos como nombre me va a pedir q lo coloque
-- en el GROUP BY ya que tambien se debe agrupar por este valor, sin embargo el
-- resultado es diferente
select inttipo, varnombre, avg(intedad)
from @table
group by inttipo, varnombre


El ejemplo es para SQL Server.

saludos
__________________
Martín Alexis Valdivia S.
-----------------------------
"Quisiéramos cambiar el mundo, pero Dios no nos daría el código fuente." CAP
"Si Saber No Es Un Derecho, Seguro Será Un Izquierdo." WD
  #6 (permalink)  
Antiguo 11/05/2009, 12:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Duda con group by

Gracias thumper por tu respuesta.

Conozco muy poco de sql server pero seguramente si pruebas esto en tu ejemplo:
select intid, promedio = avg(intedad)
from @table
group by intid;

Te va a mostrar los id y el promedio.

Si quisieras incluir el nombre:
select intid, varnombre,promedio = avg(intedad)
from @table
group by intid,varnombre;

Asumo que lo unico que cambiaría de la salida, sería la inclusión del campo varnombre. Tendrías el mismo numero de registros que la consulta anterior.

Mi pregunta es:
Por que esta consulta:
select intid, varnombre,promedio = avg(intedad)
from @table
group by intid;

No funciona, si estamos agrupando por un campo que es unico??
Por que es necesario incluir varnombre como columna en la agrupación?
Si tenemos una consulta con mas de 50 campos, por que es necesario la inclusión de estas variables en el group by cuando teóricamente no es necesario?

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 11/05/2009, 12:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Duda con group by

Alguna otra cosilla, que seguro conoceréis:

http://dev.mysql.com/doc/refman/5.0/...en-fields.html

http://weblogs.sqlteam.com/jeffs/arc.../20/60261.aspx
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:45.