SQL - buscar parejas "con algunos" campos iguales

 
Vista:

buscar parejas "con algunos" campos iguales

Publicado por mario (6 intervenciones) el 26/03/2013 17:55:42
Tenemos UNA sola tabla. En esa tabla tenemos varios campos imaginemos:

NOMBRE---APELLIDO-----PAIS-----COMPRAVENTA

El campo COMPRAVENTA puede ser "C "compra o "V" venta


Quiero realizar una consulta donde aparezcan todos los registros cuyos campos NOMBRE y APELLIDO sean coincidentes y uno sea una compra y otro una venta.

Por ejemplo si tenemos:

PEPE---GOMEZ-----ESPAÑA----C
PEPE----GOMEZ----PORTUGAL----V

En este caso NOMBRE Y APELLIDO COINCIDEN pero en uno hay C y en el otro V.

Con esta consulta quiero mostrar aquellos registros de la misma persona (independiente del pais) que se compensen (una compra y una venta).

Una solucion seria cargar la tabla 2 veces y unir los campos que son comunes (NOMBRE Y APELLIDO) y ponerle un HAVING COMPRAVENTA=c al COMPRAVENTA de la primera tabla y un HAVING COMPRAVENTA=v al COMPRAVENTA de la segunda tabla.

Pero no quiero copiar la tabla dos veces porque es ENORME y no seria operativo.
Se que es un poco lioso pero es justo lo que necesito



Muchas gracias por adelantado
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

buscar parejas "con algunos" campos iguales

Publicado por mario (6 intervenciones) el 26/03/2013 19:28:45
Por si no queda claro, es como buscar REGISTROS ESPEJO. Mostrar dos registros iguales salvo un solo campo, la direccion (como si de un reflejo se tratase).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

buscar parejas "con algunos" campos iguales

Publicado por leonardo_josue (1173 intervenciones) el 26/03/2013 20:35:25
Hola Mario:

Lo que podrías hacer es lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT * FROM tabla;
+--------+----------+----------+-------------+
| NOMBRE | APELLIDO | PAIS     | COMPRAVENTA |
+--------+----------+----------+-------------+
| PEPE   | GOMEZ    | ESPAÑA   | C           |
| PEPE   | GOMEZ    | PORTUGAL | V           |
| PEPE   | OTRO     | PORTUGAL | V           |
| OTRO   | GOMEZ    | PORTUGAL | V           |
| OTRO   | GOMEZ    | PORTUGAL | V           |
+--------+----------+----------+-------------+
5 rows in set (0.00 sec)
 
mysql> SELECT nombre, apellido
    -> FROM tabla
    -> GROUP BY nombre, apellido
    -> HAVING COUNT(DISTINCT compraventa) > 1;
+--------+----------+
| nombre | apellido |
+--------+----------+
| PEPE   | GOMEZ    |
+--------+----------+
1 row in set (0.00 sec)


Observa en la tabla de datos que el usuario OTRO GOMEZ aparece dos veces, pero sólo con ventas, es decir no tiene una compra... al hacer un COUNT(DISTINCT compraventa) estás evitando contabilizar registros de la misma especie.

El ejemplo está en MySQL, no nos dices qué BD estás utilizando, pero esto es SQL puro, debería funcionar para cualquier motor

Saludos y espero que te pueda servir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

buscar parejas "con algunos" campos iguales

Publicado por xve (284 intervenciones) el 26/03/2013 21:51:13
Muy bueno Leonardo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

buscar parejas "con algunos" campos iguales

Publicado por mario (6 intervenciones) el 27/03/2013 09:26:44
Lo voy a probar a ver que tal va. Estoy usando MySQL.

Muchisimas gracias por el aporte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

buscar parejas "con algunos" campos iguales

Publicado por mario (6 intervenciones) el 27/03/2013 09:48:41
Una ultima cuestion,
Imaginemos que tenemos un campo que nos indica el numero de operaciones de cada registro. como si de un indide univoco se tratase.

¿seria posible mostrar en una consulta, no solo el nombre y el apellido , si no dos registros con el nombre-apellido-compraventa-numero y por otro lado la pareja en sentido contrario?

Es decir, en el ejemplo de arriba, una consulta que devolviese:

PEPE | GOMEZ | ESPAÑA | C| Operacion1
PEPE | GOMEZ | PORTUGAL | V | Operacion2

Muchas gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

buscar parejas "con algunos" campos iguales

Publicado por leonardo_josue (1173 intervenciones) el 27/03/2013 16:42:15
Hola de nuevo Mario:

Aquí veo un problema y es que en realidad no veo ninguna relación entre tus registros "pares", podrías hacer algo como esto:

1
2
3
4
5
6
7
SELECT * FROM tabla T1
INNER JOIN (
SELECT nombre, apellido
FROM tabla
GROUP BY nombre, apellido
HAVING COUNT(DISTINCT compraventa) > 1) T2
ON T1.nombre = T2.nombre AND T1.apellido = T2.apellido;


Sin embargo esta consulta tiene un problema, imagina que el cliente PEPE GOMEZ tiene más de dos registros, algunos para compras y otros para ventas, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla;
+--------+----------+----------+-------------+
| NOMBRE | APELLIDO | PAIS     | COMPRAVENTA |
+--------+----------+----------+-------------+
| PEPE   | GOMEZ    | ESPAÑA   | C           |
| PEPE   | GOMEZ    | PORTUGAL | V           |
| PEPE   | OTRO     | PORTUGAL | V           |
| OTRO   | GOMEZ    | PORTUGAL | V           |
| OTRO   | GOMEZ    | PORTUGAL | V           |
| PEPE   | GOMEZ    | ESPAÑA   | C           |
+--------+----------+----------+-------------+
6 rows in set (0.00 sec)


Si ejecutas la consulta que te puse te regresaría esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM tabla T1
    -> INNER JOIN (
    -> SELECT nombre, apellido
    -> FROM tabla
    -> GROUP BY nombre, apellido
    -> HAVING COUNT(DISTINCT compraventa) > 1) T2
    -> ON T1.nombre = T2.nombre AND T1.apellido = T2.apellido;
+--------+----------+----------+-------------+--------+----------+
| NOMBRE | APELLIDO | PAIS     | COMPRAVENTA | nombre | apellido |
+--------+----------+----------+-------------+--------+----------+
| PEPE   | GOMEZ    | ESPAÑA   | C           | PEPE   | GOMEZ    |
| PEPE   | GOMEZ    | PORTUGAL | V           | PEPE   | GOMEZ    |
| PEPE   | GOMEZ    | ESPAÑA   | C           | PEPE   | GOMEZ    |
+--------+----------+----------+-------------+--------+----------+
3 rows in set (0.00 sec)


Es decir, te regresará TODOS LOS REGISTROS PARA ESE CLIENTE, no solo los que formen las "parejas", no sé si esto te sirva.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

buscar parejas "con algunos" campos iguales

Publicado por mARIO (6 intervenciones) el 01/04/2013 12:44:46
Esto me valdrá. Muchas gracias por vuestra ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar