Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Agrupar por nombres y apellidos iguales (https://www.clubdelphi.com/foros/showthread.php?t=88273)

MAXIUM 12-05-2015 21:34:06

Agrupar por nombres y apellidos iguales
 
Saludos.

Siempre me sorprende la flexibilidad de este lenguaje para hacer consultas. Pero la siguiente no se que factible sea.

El asunto es el siguiente. Tengo una tabla con nombres y apellidos. Y lo que tengo que buscar, es aquellos que tengan el mismo apellido paterno y nombre.

Un ejemplo de esto: el abuelo se llama Juan, al igual que su hijo y su nieto. ¿Como por puedo filtrar la tabla para encontrarlos?

Casimiro Notevi 12-05-2015 21:43:22

Creo que no se entiende lo que preguntas, pero si buscas a todos los que se llamen de nombre 'juan' y de apellido 'smith' tendrás que hacer:
Código SQL [-]
select * from tbPersonas where nombre='juan' and apellido='smith'

MAXIUM 12-05-2015 22:40:11

Eso sería facil, pero no se ni el nombre, ni apellido.

Tendría que ser algo como ordenar por nombre y apellido paterno, descartar a aquellos que sean únicos en aquel ordenamiento.

Casimiro Notevi 12-05-2015 22:46:35

Sigo sin entender, ¿entonces qué dato conoces y qué dato necesitas?

MAXIUM 12-05-2015 23:48:55

Data
Código:

LOPEZ PEREZ JUAN
LOPEZ MARDONES LUISA
LOPEZ MANRIQUEZ JUAN
LOPEZ LOPEZ ESTEBAN
MALUENDA GONZALEZ FRANCISCA
MALUENDA DE LA JARA ANA
MALUENDA MERCEDEZ FRANCISCA
MALUENDA TORROJA HERNESTO
MALUENDA TAPIA FRANCISCA

Resultado de la consulta
Código:

LOPEZ PEREZ JUAN
LOPEZ MANRIQUEZ JUAN

MALUENDA GONZALEZ FRANCISCA
MALUENDA MERCEDEZ FRANCISCA
MALUENDA TAPIA FRANCISCA

La idea es formar grupos donde tanto el nombre y apellido paterno coincidan en toda la tabla. Sin especificar el nombre ni apellido, sino que filtrar toda la tabla cuando se encuentre un nombre que se repite al igual que su apellido :p

ecfisa 13-05-2015 02:30:15

Hola MAXIUM.

Un modo es:
Código SQL [-]
SELECT APEL_PATER, APEL_MATER, NOMBRE
FROM TU_TABLA
WHERE APEL_PATER IN (SELECT APEL_PATER FROM TU_TABLA
      GROUP BY APEL_PATER HAVING COUNT(*) > 1 )
  AND NOMBRE IN (SELECT NOMBRE FROM TU_TABLA
      GROUP BY NOMBRE HAVING COUNT(*) > 1 )
ORDER BY APEL_PATER

Saludos :)

MAXIUM 13-05-2015 05:13:23

Cita:

Empezado por ecfisa (Mensaje 492088)
Hola MAXIUM.

Un modo es:
Código SQL [-]
SELECT APEL_PATER, APEL_MATER, NOMBRE
FROM TU_TABLA
WHERE APEL_PATER IN (SELECT APEL_PATER FROM TU_TABLA
      GROUP BY APEL_PATER HAVING COUNT(*) > 1 )
  AND NOMBRE IN (SELECT NOMBRE FROM TU_TABLA
      GROUP BY NOMBRE HAVING COUNT(*) > 1 )
ORDER BY APEL_PATER

Saludos :)

Casi...


ecfisa 13-05-2015 08:22:49

Hola MAXIUM.

Tenes razón, probé con los datos del mensaje #5, funcionaba bién y pensé que lo tenía. Pero agregando otros datos noté, que debido a la conjunción del WHERE, agrega nombres que no debería.
Está complicado el asunto desde una consulta... tal vez tengas que usar un procedimiento almacenado.

Saludos :)

fjcg02 13-05-2015 09:08:47

Esto es muuuuuy sucio, pero funciona, casi seguro. No lo he probado.
Miras y nos cuentas...

Saludos

Código SQL [-]
SELECT AA.APEL_PATER, AA.APEL_MATER, AA.NOMBRE
FROM  TU_TABLA
inner join (SELECT APEL_PATER, NOMBRE, COUNT(1) FROM  TU_TABLA
      GROUP BY APEL_PATER, NOMBRE 
      HAVING COUNT(1) > 1 
) AA ON ( APEL_PATER= AA.APEL_PATER AND NOMBRE=AA.NOMBRE)

fjcg02 13-05-2015 09:09:48

Otra opción es tal y como te hemos comentado antes, hacer un procedimiento almacenado, o una vista con los que se repiten para cruzarla con tu tabla.

Saludos

fjcg02 13-05-2015 09:59:37

Cita:

Empezado por fjcg02 (Mensaje 492099)
Esto es muuuuuy sucio, pero funciona, casi seguro. No lo he probado.
Miras y nos cuentas...

Saludos

Código SQL [-]
SELECT APEL_PATER, APEL_MATER, NOMBRE
FROM  TU_TABLA
inner join (SELECT APEL_PATER, NOMBRE, COUNT(1) FROM  TU_TABLA
      GROUP BY APEL_PATER, NOMBRE 
      HAVING COUNT(1) > 1 
) AA ON ( APEL_PATER= AA.APEL_PATER AND NOMBRE=AA.NOMBRE)

Estaban mal los tres campos que devuelve la consulta... los he corregido.

Saludos

bucanero 13-05-2015 10:07:20

Cita:

Empezado por ecfisa (Mensaje 492088)
Un modo es:
Código SQL [-]
SELECT APEL_PATER, APEL_MATER, NOMBRE
FROM TU_TABLA
WHERE APEL_PATER IN (SELECT APEL_PATER FROM TU_TABLA
      GROUP BY APEL_PATER HAVING COUNT(*) > 1 )
  AND NOMBRE IN (SELECT NOMBRE FROM TU_TABLA
      GROUP BY NOMBRE HAVING COUNT(*) > 1 )
ORDER BY APEL_PATER

La idea de Ecfisa deberia de funcionar con la variación de unir los campos de apellido_paterno y nombre en la misma consulta. Esto ya dependiendo del motor de bases de datos se podrá hacer de una forma u otra:

Para MSSQL es:

Código SQL [-]
SELECT APEL_PATER, APEL_MATER, NOMBRE
FROM TU_TABLA
WHERE APEL_PATER+NOMBRE  IN (SELECT APEL_PATER+NOMBRE  FROM TU_TABLA
      GROUP BY APEL_PATER+NOMBRE HAVING COUNT(*) > 1 )
ORDER BY APEL_PATER

Y para MySQL es:
Código SQL [-]
SELECT APEL_PATER, APEL_MATER, NOMBRE
FROM TU_TABLA
WHERE (APEL_PATER, NOMBRE)  IN (SELECT APEL_PATER, NOMBRE  FROM TU_TABLA
      GROUP BY APEL_PATER, NOMBRE HAVING COUNT(*) > 1 )
ORDER BY APEL_PATER

Un Saludo

ecfisa 13-05-2015 10:26:31

Hola.

Si, definitivamente bucanero dió en el blanco con la concatenación. ^\||/

En Firebird:
Código SQL [-]
SELECT APEL_PATER || ' ' || NOMBRE
FROM TU_TABLA
WHERE APEL_PATER || ' ' || NOMBRE  IN (SELECT APEL_PATER || ' ' || NOMBRE  FROM TU_TABLA
      GROUP BY 1 HAVING COUNT(*) > 1 )
ORDER BY 1

Saludos :)

MAXIUM 17-05-2015 17:33:45

Como dije, es sorprendente SQL. Pero es nada sin alguien que tenga la habilidad de usarlo.

Muchisimas gracias todos.

Casimiro Notevi 17-05-2015 19:39:08

Cita:

Empezado por MAXIUM (Mensaje 492224)
Como dije, es sorprendente SQL. Pero es nada sin alguien que tenga la habilidad de usarlo.

Bueno, eso pasa con casi todo :)


La franja horaria es GMT +2. Ahora son las 11:00:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi