SQL - Ayuda con una consulta

 
Vista:

Ayuda con una consulta

Publicado por Rafael Renteria (5 intervenciones) el 03/04/2014 00:19:10
Hola, espero me puedan ayudar y de antemano gracias...

Quiero realizar una consulta que me muestre todos los "num_prest_od" que contengan la mismos datos tanto en "pagad_od" como en "organ_od"
Ejemplo de datos:

num_prest_od || pagad_od || organ_od

20020390529 || 07315 || 26
20050227192 || 07336 || 26
20070613086 || 07315 || 26
20110569168 || 99900 || 9
20110572141 || 02000 || 11
20120470529 || 03300 || 11
20120474203 || 03300 || 96
20120493361 || 03300 || 11


Ejemplo de salida:

num_prest_od || pagad_od || organ_od

20020390529 || 07315 || 26
20070613086 || 07315 || 26
20050227192 || 07336 || 26
20120544490 || 07336 || 26
20120470529 || 03300 || 11
20120493361 || 03300 || 11
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
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

Ayuda con una consulta

Publicado por xve (284 intervenciones) el 03/04/2014 09:07:12
Hola Rafael no se si te he entendido bien, pero creo que seria algo así

1
2
3
SELECT * FROM
(SELECT *,count(*) as Total FROM Tabla GROUP BY pagad_od,organ_od) S1
WHERE Total>1

Coméntanos ok?
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

Ayuda con una consulta

Publicado por Rafael Renteria (5 intervenciones) el 03/04/2014 17:48:02
Hola xve, pues en realidad no, mira si pongo algo así

SELECT * FROM
(SELECT pagad_od,organ_od, count(*) as Total FROM orden_desc WHERE ssaaqq_inicio_od = 012013 GROUP BY pagad_od,organ_od) S1
WHERE Total>1

el resultado está bien, pero si aumento otro campo a la consulta ya sale mal... mira por ejemplo, quiero saber que empleados trabajan en la misma empresa y mismo departamento.

P.e

Empleado || Empresa ||Depto
Juan || Uno || 5
Pedro || Uno || 5
Jose || Dos || 1
Arturo || Dos ||1

Algo así... si me explico??... pero por ejemplo en mi caso puedo mostrar La empresa, el depto sin problemas, y a la hora de poner el campo Empresa en la consulta se modifica todo y muestra todos los datos aunque no sean de misma empresa o depto.

P.e

Empleado || Empresa ||Depto
Juan || Uno || 5
Pedro || Uno || 2
Jose || Dos || 3
Arturo || Dos ||1
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: 109
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda con una consulta

Publicado por Rafael (111 intervenciones) el 03/04/2014 18:08:43
Prueba con esto ...
1
2
3
4
5
SELECT *
FROM orden_desc
WHERE ssaaqq_inicio_od = 012013
GROUP BY pagad_od, organ_od
HAVING COUNT(*) > 1

Cuentanos....
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

Ayuda con una consulta

Publicado por Rafael Renteria (5 intervenciones) el 03/04/2014 18:20:13
Puede ser mi manejador de BD (Aqua Studio) o la BD (Informix) la que no lo permita pero esa consulta marca error, tengo que meter todos los campos dentro del group by,

Error: The column (num_prest_od) must be in the GROUP BY list.

creo que no permite en ese tipo de consulta el SELECT * y agruparlo solo por dos campos... y si meto todos los campos en el group by pues sigue sin darme el resultado que busco... Espero me puedas ayudar..
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

Ayuda con una consulta

Publicado por leonardo_josue (1173 intervenciones) el 03/04/2014 21:38:53
Hola Rafael Renteria:

Este tipo de consultas es básica en el ambiente de BD's. Tienes muchas formas para resolverla, pero una de las más comunes es utilizar una subconsulta y un JOIN's. No he trabajado con Informix, pero lo que voy a poner es básicamente SQL estándar que debería funcionar para todos los DBMS's...

El primer paso es obtener aquellos registros que estén duplicados... voy a utilizar los primeros datos que pusiste de ejemplo, si agrupamos SOLO POR LOS CAMPOS QUE TE INTERESAN (pagad_od || organ_od) obtenemos lo siguiente.

OJO, el ejemplo lo hago con MySQL pero espero que te pueda servir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT * FROM tabla;
+--------------+----------+----------+
| num_prest_od | pagad_od | organ_od |
+--------------+----------+----------+
| 20020390529  | 07315    | 26       |
| 20050227192  | 07336    | 26       |
| 20070613086  | 07315    | 26       |
| 20110569168  | 99900    | 9        |
| 20110572141  | 02000    | 11       |
| 20120470529  | 03300    | 11       |
| 20120474203  | 03300    | 96       |
| 20120493361  | 03300    | 11       |
+--------------+----------+----------+
8 rows in set (0.00 sec)

Con esta tabla se puede observar que los registros duplicados son

1
2
3
4
| 20020390529  | 07315    | 26       |
| 20070613086  | 07315    | 26       |
| 20120470529  | 03300    | 11       |
| 20120493361  | 03300    | 11       |

En tu primer post mencionas otros datos como duplicados (20120544490 || 07336 || 26) pero este registro no aparece en tu tabla original.

Entonces, puedes hacer una consulta así:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT pagad_od, organ_od, COUNT(*)
    -> FROM tabla
    -> GROUP BY pagad_od, organ_od
    -> HAVING COUNT(*) > 1;
+----------+----------+----------+
| pagad_od | organ_od | COUNT(*) |
+----------+----------+----------+
| 03300    | 11       |        2 |
| 07315    | 26       |        2 |
+----------+----------+----------+
2 rows in set (0.00 sec)


Esta consulta lo que te obtiene es los valores que estás considerando para decir que un registro está duplicado y el número de veces que está duplicado (2)... Ahora bien, dado que quieres obtener TODA LA INFORMACIÓN DE TU TABLA ORIGINAL, NO SOLO ESTAS DOS COLUMNAS, lo que tienes que hacer es utilizar esta consulta y FILTRAR tus datos... La mejor manera es hacerla con un JOIN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT T1.* FROM tabla T1
    -> INNER JOIN
    -> (  SELECT pagad_od, organ_od
    ->    FROM tabla
    ->    GROUP BY pagad_od, organ_od
    ->    HAVING COUNT(*) > 1 ) T2 ON T1.pagad_od = T2.pagad_od AND
    ->                                T1.organ_od = T2.organ_od;
+--------------+----------+----------+
| num_prest_od | pagad_od | organ_od |
+--------------+----------+----------+
| 20020390529  | 07315    | 26       |
| 20070613086  | 07315    | 26       |
| 20120470529  | 03300    | 11       |
| 20120493361  | 03300    | 11       |
+--------------+----------+----------+
4 rows in set (0.00 sec)

Que es lo que desde mi punto de vista deseas obtener. Dale un vistazo para ver si te sirve... insisto en que esto es básicamente SQL estándar, por lo que no deberías tener problemas, pero si fuera el caso nos lo comentas y te damos otras alternativas. Esta en definitiva es la mejor forma para obtener lo que quieres.

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

Ayuda con una consulta

Publicado por Rafael Renteria (5 intervenciones) el 04/04/2014 00:13:46
Hola muchas gracias Leo por el aporte, de hecho si me sirvió. Pero ahora tengo otro problema, cuando agrego una condicion ya se descompone todo xq me vuelven a aparecer los datos que no estan repetidos.

P.e

1
2
3
4
5
6
7
select t1.* from orden_desc t1
inner join (select pagad_od, organ_od
from orden_desc
group by pagad_od, organ_od
having count(*) > 1) t2 on t1.organ_od = t2.organ_od and
                    t2.pagad_od = t1.pagad_od
where t1.ssaaqq_inicio_od = 012013

Con esa condición me regresa todos los datos y no sólo los repetidos.

1
2
3
4
5
6
7
8
9
10
num_prest_od   ||  organ_od  ||  pagad_od   ||  ssaaqq_inicio_od
___________________________________________________
 20120508348   ||   11     ||      00100    ||    012013
 20110572141   ||   11     ||      02000    ||    012013
 20120418162   ||   11     ||      03300    ||    012013
 20120470529   ||   11     ||      03300    ||    012013
 20120493361   ||   11     ||      03300    ||    012013
 20120498045   ||   96     ||      03300    ||    012013
 20120499433   ||   11     ||      03300    ||    012013
 20120474203   ||   96     ||      03300    ||    012013

Los primeros datos no deberian estar, pero aparecen... Como que sólo me toma en cuenta la condicion de fecha y no la del JOIN... Espero me puedas ayudar.
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

Ayuda con una consulta

Publicado por Rafael Renteria (5 intervenciones) el 04/04/2014 00:42:39
listo LEO...

te comparto el resultado a mi problema, así es como me quedó mi consulta final, de verdad muchas gracias :D

1
2
3
4
5
6
7
select t1.* from orden_desc t1
inner join (select pagad_od, organ_od, ssaaqq_inicio_od
from orden_desc
group by pagad_od, organ_od, ssaaqq_inicio_od
having count(*) > 1) t2 on t1.organ_od = t2.organ_od and
                    t2.pagad_od = t1.pagad_od and  t2.ssaaqq_inicio_od=t1.ssaaqq_inicio_od
                    and t2.ssaaqq_inicio_od= 012013
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