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

Consulta con group by en MySQL

Estas en el tema de Consulta con group by en MySQL en el foro de Mysql en Foros del Web. Hola, saludos a todos, tengo la siguiente duda y no he logrado dar con la consulta adecuada... Hay una tabla con datos sobre unos Pagos, ...
  #1 (permalink)  
Antiguo 19/05/2015, 12:25
 
Fecha de Ingreso: mayo-2015
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Consulta con group by en MySQL

Hola, saludos a todos, tengo la siguiente duda y no he logrado dar con la consulta adecuada...

Hay una tabla con datos sobre unos Pagos, que estoy tratando de normalizar... Esta tabla tiene datos repetidos de la siguiente forma:

Cita:
Codigo, Nombre, FechaPago
001, *****'Manuel Cercas',***** '10/10/2014'
002, *****'Jorge Rojas', *****'15/10/2014'
003, *****'Jorge Rojas', *****'16/10/2014'
001, *****'Esteban Reyes', *****'11/10/2014'
003, *****'Jorge Rojas', *****'12/10/2014'
Las fechas son lo de menos... El problema es que, como ven, por una u otra razón la tabla puede tener Codigos repetidos con personas con más de un Código, o incluso un Código al que le corresponda más de un nombre (talvez por error de tipeo).

No son muchos casos, pero me gustaría identificarlos para corregirlos, y no logro dar con la consulta correcta, he tratado aplicando primero un Distinct a "Codigo", pero de ahí en más no sé cómo decirle al MySQL que me cuente cuántas personas diferentes comparten ese código, y sobre todo cuáles son... Espero que me puedan dar unos alcances, un saludo.
  #2 (permalink)  
Antiguo 19/05/2015, 12:41
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, 11 meses
Puntos: 2658
Respuesta: Consulta con group by en MySQL

Cita:
El problema es que, como ven, por una u otra razón la tabla puede tener Codigos repetidos con personas con más de un Código, o incluso un Código al que le corresponda más de un nombre (talvez por error de tipeo).
Esas condiciones son incompatibles para hacerlas en una misma consulta, en especial para lograr una normalizacion de los datos.
Tal parece que hay más de una relación N:M y no está claro cómo se construye.

Si quieres una ayuda para normalizar, primero deberías explciarnos qué es un Código, y cómo puede un pago relacionarse con diferentes personas en el mismo código, o diferentes códigos para la misma persona.
SIn esa info, es dificil diseñar las consultas que te ayuden a realizar la normalziación. Y no pasa por usar sólo el GROUP BY.

Si hay más de una relación N:M entre el pago y otras entidades, eso implicaría que hay más tablas de lo que parece...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 19/05/2015, 14:49
 
Fecha de Ingreso: mayo-2015
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Consulta con group by en MySQL

Estás en lo cierto, hay más tablas de las que parece, justamente porque la "tabla" de que te hago mención no está normalizada, a lo mucho debería mostrar el Código y la fecha de pago a un costado...

El código es, aunque no parezca, la "clave única" que le pertenece a un sólo nombre. Pero tabla la encontré así como la ves y es mi labor corregir sus inconsistencias y darle el orden debido... Pero antes de dejar por lo menos una tabla con campos "Código, Fecha_de_pago", debo identificar qué personas tienen códigos repetidos (y viceversa, si se puede una cosa se podrá también al revés).

La inconsistencia parece que se dio por problemas de digitación y porque, en algunos casos, a unas pocas personas se les asignó posteriormente algún otro código. Sólo quiero saber, talvez tomando como referencia el Nombre (como si fuera PK), cuántos códigos distintos pueden existir para esa persona, y recién podré hacer las correcciones para normalizar la(s) tabla(s).

He pensado en ir volcando los datos en una tabla distinta (pero con claves únicas y claras), y ahí ver dónde están los errores de redundancia o inconsistencia (conforme haga los ingresos me deben saltar errores), pero si se puede todo con alguna consulta, anidada, agrupada, como sea, me sería mucho mejor. Espero haya una solución, gracias por la ayuda.
  #4 (permalink)  
Antiguo 19/05/2015, 15:09
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 2 meses
Puntos: 774
Respuesta: Consulta con group by en MySQL

podrias hacer un group by con having count para conocer cuales codigos son los que se repiten, ya con esos codigos podrias revisar la tabla para encontrar los nombres...y poco a poco ir acomodando tus datos....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 19/05/2015, 15:17
 
Fecha de Ingreso: mayo-2015
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Consulta con group by en MySQL

Hola, Libras, gracias por responder.

Pues sí, intenté con el group y el having count pero... el tema es que tanto Códigos como Nombres forzosamente se repiten porque una misma persona ha hecho varios pagos en el tiempo. El problemita mío es que en algunas filas el Código y el Nombre no coinciden: un tipo llamado "Juan Pérez" con código "002" a lo largo de la tabla, puede tener de pronto el código "001" en algún registro. Lo que quiero es identificar cuáles son estos registros para poderlos corregir. =/
  #6 (permalink)  
Antiguo 19/05/2015, 15:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 2 meses
Puntos: 774
Respuesta: Consulta con group by en MySQL

y porque no pruebas concatenando los codigos con nombre algo asi:


Código SQL:
Ver original
  1. SELECT * FROM(
  2. SELECT codigo + '#' + nombre AS campo FROM tabla
  3. ) AS t1 GROUP BY campo HAVING COUNT(campo)>1

Ojo la sentencia es para sql server...no se si pueda aplicar lo mismo para mysql
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 19/05/2015, 15:46
 
Fecha de Ingreso: mayo-2015
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Consulta con group by en MySQL

Sí, en MySQL es concat en lugar de los "+"... Lo probé, amigo, pero la consulta me devuelve las veces que se repite la dupla "Código+Nombre" (es decir las veces que tal persona ha hecho un pago), pero no me dice nada de las anomalías, por así decirlo, las veces que una fila se "salga de la regla" y le asigne a cierto Nombre un Código que no le corresponde.

Estoy volcando los datos a otra tabla donde trabaje el Nombre como primary key. Con un update le colocaré a cada cuál el código que le corresponde (también único), y a ver en qué fila me saltará el error de clave duplicada... Aunque es el camino largo, sigo pensando que se puede hacer siempre mediante alguna consulta anidada en la tabla original. :/
  #8 (permalink)  
Antiguo 19/05/2015, 15:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 2 meses
Puntos: 774
Respuesta: Consulta con group by en MySQL

lo que pasa es que no explicas que es lo que necesitas, de estos datos:

Codigo, Nombre, FechaPago
001, *****'Manuel Cercas',***** '10/10/2014'
002, *****'Jorge Rojas', *****'15/10/2014'
003, *****'Jorge Rojas', *****'16/10/2014'
001, *****'Esteban Reyes', *****'11/10/2014'
003, *****'Jorge Rojas', *****'12/10/2014'


que es lo que te gustaria obtener???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 19/05/2015, 16:04
 
Fecha de Ingreso: mayo-2015
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Consulta con group by en MySQL

Una tabla con Códigos y Nombres correspondiéndose 1:1... Para eso debo "arreglar" esos datos que listé, saber en qué fila 'Manuel Cercas' no tiene código '001' sino otro incorrecto, y así nombre por nombre...
  #10 (permalink)  
Antiguo 19/05/2015, 16:10
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 2 meses
Puntos: 774
Respuesta: Consulta con group by en MySQL

pero como sabes que a manuel le toca el 001???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 19/05/2015, 16:23
 
Fecha de Ingreso: mayo-2015
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Consulta con group by en MySQL

Por "tendencia general" (hay otra base de datos con códigos medianamente correctos, pero está de más cotejarla pues se complicarían las cosas): Digamos que hay 20 registros del tipo "Manuel->001", y uno del tipo "Manuel->002", éste sería el incorrecto y el que tendría que editar. Claro que MySQL no conoce de correctos o incorrectos, por eso quería detectar esas anomalías a través de una consulta: cuántos códigos distintos existen para el nombre Manuel, cuáles son, en qué filas... Y eso.
  #12 (permalink)  
Antiguo 19/05/2015, 16:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 2 meses
Puntos: 774
Respuesta: Consulta con group by en MySQL

Entonces para este caso el que quisieras que arrojara seria:

Codigo, Nombre, FechaPago
001, *****'Manuel Cercas',***** '10/10/2014'
002, *****'Jorge Rojas', *****'15/10/2014'
003, *****'Jorge Rojas', *****'16/10/2014'
001, *****'Esteban Reyes', *****'11/10/2014'
003, *****'Jorge Rojas', *****'12/10/2014'

estoy en lo correcto?? de ser asi cual es la logica para sacar ese dato? quieres hacerlo con una sola consulta, pero los datos que aportas son muy pocos y no tienes un parametro para conocer si esta bien o no......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 19/05/2015, 16:34
 
Fecha de Ingreso: mayo-2015
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Consulta con group by en MySQL

Correcto. Ése sería un dato erróneo, precisamente busco darle la lógica correcta para que me aparezca esa fila, mediante una o más consultas anidadas, agrupadas, etc... Por eso pensé tomar el Nombre como clave única mediante distinct, y a partir de ahí cotejar de alguna forma cuántos códigos diferentes le correspondían a ese dato único...

Como dije, he volcado así los datos en otra Tabla2, con Nombre único, y estoy tratando de ir volcándole ahora los códigos que "se correspondan" con cada nombre, recorriendo una a una las filas de la Tabla1. En algún momento me saltaría un error tipo "Tal Nombre ya tiene un Código distinto asignado", y sabré para cuáles nombres es el problema, en qué fila ocurre, y así...

Pero eso ya usando otra tabla, algún procedimiento almacenado, etc. Parece que mediante una sola consulta no me aparecerían las redundancias que ando buscando.

Etiquetas: bases-de-datos-general, group, tabla
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:57.