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

[SOLUCIONADO] Problema GROUP BY

Estas en el tema de Problema GROUP BY en el foro de Bases de Datos General en Foros del Web. Buenas noches a todos! Tengo una base de datos ORACLE y estoy trabajando con el oci_connect, etc...para mediante php, hacer listados de los campos que ...
  #1 (permalink)  
Antiguo 19/05/2009, 14:47
 
Fecha de Ingreso: febrero-2008
Mensajes: 76
Antigüedad: 16 años, 3 meses
Puntos: 0
Problema GROUP BY

Buenas noches a todos!

Tengo una base de datos ORACLE y estoy trabajando con el oci_connect, etc...para mediante php, hacer listados de los campos que tengo en la base de datos.

Me da un error en un GROUP BY...en el que intento seleccionar todos los campos de la tabla clientes, y agruparlos por 'provincia' y 'poblacion' y ordenarlos por 'nombre':

Código:
'SELECT codigo,nif,nombre,direccion,poblacion,provincia,dpostal,telefono,fax,email,bancocc,formadepago,vencimientos,diadepago,periodo FROM clientes GROUP BY provincia,poblacion ORDER BY nombre'
PD: se que para seleccionar todos los campos puedo hacer 'select *', pero así vais a poder ver todos los campos que tengo en la tabla por si el error está allí.

MUCHAS GRACIAS AMIGOS! :D
  #2 (permalink)  
Antiguo 20/05/2009, 06:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Problema GROUP BY

Código sql:
Ver original
  1. SELECT codigo,
  2. nif,
  3. nombre,
  4. direccion,
  5. poblacion,
  6. provincia,
  7. dpostal,
  8. telefono,
  9. fax,
  10. email,
  11. bancocc,
  12. formadepago,
  13. vencimientos,
  14. diadepago,
  15. periodo
  16. FROM clientes
  17. ORDER BY provincia,población,nombre

Ese group by no tiene ningun sentido creo que este ORDER BY dará lo que buscas..

Quim
  #3 (permalink)  
Antiguo 20/05/2009, 07:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema GROUP BY

Si agrupas por Provincia y Población, lo que haces es hacer desaparecer todos los registros en que se repita la misma combinación por un efecto de acumulación, que es el objetivo del GROUP BY. Luego no tendrás registros diferenciados por el Nombre; sólo te quedará uno por cada combinación Provincia+Población.
El objetivo de un GROUP BY es recuperar o un conjunto de datos diferenciados (en este ejemplo serían las poblaciones de cada provincia), o bien obtener datos de agregación (cantidad de habitantes, por ejemlpo, usando COUNT(*)). Si no has a hacer ni una cosa ni la otra, no tiene sentido usarlo.
Como dice quimfv, lo que estás buscando es el ORDER BY, no el GROUP BY.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 20/05/2009, 17:56
 
Fecha de Ingreso: febrero-2008
Mensajes: 76
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Problema GROUP BY

Muchisimas gracias por vuestros mensajes, me encanta aprender cosas nuevas cada día, y gracias a vosotros esto es posible :D

...una dudilla, haciendo "ORDER BY provincia,población,nombre"...me agrupa los resultados por província y por población y me los ordena por nombre?? o me los ordena todos por província, población y nombre? pensaba que el group by era para hacer pequeños grupillos de resultados, en este caso que cada província tuviera un pequeño grupo con todos sus pueblos ordenados alfabéticamente...

...otra dudilla...y si quisiera agrupar los resultados por nombre de población y ordenarlos por nombre de cliente??

Aprendí mal el significado de order by (ordenar?) y group by (agrupar?).

SALUDOS CRACKS :)
  #5 (permalink)  
Antiguo 20/05/2009, 18:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema GROUP BY

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 original
  1. SELECT COUNT(*)
  2. FROM TABLA;
  3.  
  4. SELECT AVG(CAMPO1)
  5. FROM TABLA;
  6.  
  7. SELECT SUM(CAMPO1), MAX(CAMPO2), MIN(CAMPO3), AVG(CAMPO4)
  8. FROM TABLA;
¿Se va entendiendo la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 21/05/2009, 07:21
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 3 meses
Puntos: 360
Respuesta: Problema GROUP BY

Cita:
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
Esto solo pasa en mysql gnzsoloyo.
En otros gestores de bases de datos (ORACLE) es necesaria la inclusión de todos los campos expuestos en la consulta, ya que no permiten esconder registros sin ningún criterio que los diferencie de los otros.

Cita:
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:
Totalmente de acuerdo. Es para el uso de este tipo de funciones, que el group by es una excelente herramienta.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 21/05/2009 a las 08:07
  #7 (permalink)  
Antiguo 21/05/2009, 09:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema GROUP BY

Cita:
En otros gestores de bases de datos (ORACLE) es necesaria la inclusión de todos los campos expuestos en la consulta
Si, es cierto. Además, ni siquiera permite que se restrinjan los registros con el WHERE sino con el HAVING, que el MYSQL si permite.
Precisamente por eso hay que tener precaución con la migración entre DBMS; los conflictos de sintaxis generan resultados y errores inesperados.

Lo siento, me paso saltando tanto entre DBMS, que a veces me olvido estos detalles.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 21/05/2009, 14:02
 
Fecha de Ingreso: febrero-2008
Mensajes: 76
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Problema GROUP BY

Muchísimas gracias gnzsoloyo por tu magnífica y detallada respuesta y muchas gracias también para huesos52 por tu aclaración.

Me ha quedado clarísimo :)

Voy a practicar order by y group by hasta que quede todo bien. Sois unos cracks, tenía un mal concepto de group by...

SALUDOS, SALUD Y SUERTE AMIGOS :D
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 00:54.