Oracle - Consulta sql

 
Vista:
sin imagen de perfil

Consulta sql

Publicado por Ruben (5 intervenciones) el 02/04/2014 18:21:00
Buenas amig@s tengo un problema en hallar una resta para una tabla verán la estructura es la siguiente:

C1 | Cod | C3 | C4
M1 | 1 | 13 | 17
M1 | 2 | 9 | 27
M1 | 1 | 33 | 34
M1 | 2 | 90 | 29
M2 | 1 | 30 | 89
M2 | 1 | 50 | 58
M2 | 1 | 25 | 63
M2 | 2 | 11 | 79
M3 | 1 | 10 | 13

lo que quiero es que para cada M1, M2, M3, hallar la diferencia entre
- el menor valor de la columna C3 que tengan como valor en la columna Cod=1
- el mayor valor de la columna C4 que tengan como valor en la columna Cod=2
- si solo se tiene 1 Cod=1 o 1 Cod=2, entonces no calcular nada o poner null

o sea deberia quedar algo asi:

C1 | max(C4 q tengan como Cod=2) - min(C3 q tengan como Cod=1 )
M1 | 16 ( pues la diferencia seria 29 - 13)
M2 | 54 ( pues la diferencia seria 79 - 25)
M3 | null

Espero se entienda,ojala alguien se apiade de mi xD.

Saludos!
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

Consulta sql

Publicado por luis pablo (235 intervenciones) el 02/04/2014 22:06:56
Hola, cuando dices:
"si solo se tiene 1 Cod=1 o 1 Cod=2, entonces no calcular nada o poner null"

te refieres a que si tiene un registro para Cod=1 ó Cod=2 ???

Me confirmas.


Saludos


Luis
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

Consulta sql

Publicado por luis pablo (235 intervenciones) el 02/04/2014 22:27:58
Hola, según tu requerimiento, seria algo así, en una sentencia "select " :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
SELECT  C.C1, DECODE(C.CANT_REG, 1, NULL, A.MAXIMO-B.MINIMO ) TOTAL FROM (
    Select X.C1,  MAX(x.C4) MAXIMO from (
        SELECT 'M1' C1 , 1 COD , 13 C3, 17 C4  FROM DUAL
        UNION ALL
        SELECT 'M1' , 2 , 9 , 27  FROM DUAL
        UNION ALL
        SELECT 'M1' , 1 , 33 , 34  FROM DUAL
        UNION ALL
        SELECT 'M1' , 2 , 90 , 29  FROM DUAL
        UNION ALL
        SELECT  'M2' , 1 , 30 , 89  FROM DUAL
        UNION ALL
        SELECT 'M2' , 1 , 50 , 58 FROM DUAL
        UNION ALL
        SELECT 'M2' , 1 , 25 , 63  FROM DUAL
        UNION ALL
        SELECT 'M2' , 2 , 11 , 79  FROM DUAL
        UNION ALL
        SELECT 'M3' , 1 , 10 , 13  FROM DUAL)x
    WHERE X.COD=2
    GROUP BY X.C1 ) A ,
    (
    Select X.C1,MIN(x.C3)MINIMO from (
        SELECT 'M1' C1 , 1 COD , 13 C3, 17 C4  FROM DUAL
        UNION ALL
        SELECT 'M1' , 2 , 9 , 27  FROM DUAL
        UNION ALL
        SELECT 'M1' , 1 , 33 , 34  FROM DUAL
        UNION ALL
        SELECT 'M1' , 2 , 90 , 29  FROM DUAL
        UNION ALL
        SELECT  'M2' , 1 , 30 , 89  FROM DUAL
        UNION ALL
        SELECT 'M2' , 1 , 50 , 58 FROM DUAL
        UNION ALL
        SELECT 'M2' , 1 , 25 , 63  FROM DUAL
        UNION ALL
        SELECT 'M2' , 2 , 11 , 79  FROM DUAL
        UNION ALL
        SELECT 'M3' , 1 , 10 , 13  FROM DUAL)x
    WHERE X.COD=1
    GROUP BY X.C1) B,
    (
    Select X.C1,count(1) cant_reg from (
        SELECT 'M1' C1 , 1 COD , 13 C3, 17 C4  FROM DUAL
        UNION ALL
        SELECT 'M1' , 2 , 9 , 27  FROM DUAL
        UNION ALL
        SELECT 'M1' , 1 , 33 , 34  FROM DUAL
        UNION ALL
        SELECT 'M1' , 2 , 90 , 29  FROM DUAL
        UNION ALL
        SELECT  'M2' , 1 , 30 , 89  FROM DUAL
        UNION ALL
        SELECT 'M2' , 1 , 50 , 58 FROM DUAL
        UNION ALL
        SELECT 'M2' , 1 , 25 , 63  FROM DUAL
        UNION ALL
        SELECT 'M2' , 2 , 11 , 79  FROM DUAL
        UNION ALL
        SELECT 'M3' , 1 , 10 , 13  FROM DUAL)x
        WHERE  X.COD=1 OR X.COD=2
        GROUP BY X.C1
    ) C
WHERE A.C1(+)=B.C1
AND C.C1=B.C1(+) ;

He generado datos con un select porque no tengo datos para probar los resultados.

Estoy hallando la diferencia entre el mayor y el menor
y mostrando el resultado de la diferencia en Null si tiene 1 registro para cod=1 ó cod=2 .

Espero sea lo que necesitas, esto lo he realizado en una sentencia select , aunque tambien lo puedes hacer en una funcion de BD o a nivel de aplicación según lo deseas.

Me confirmas si es lo que necesitas.

Saludos

Luis
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

Consulta sql

Publicado por Ruben (5 intervenciones) el 03/04/2014 15:33:11
Hola, ejecute el script pero me sale los resultados correctos en algunos registros y en otros me los pone como null, sabes como poder corregir esto, en la base q manejo, se tiene aparte del cod 1 y 2, 3 4 5, para un mismo M1, M2, M3. Osea estos cod, no siempre existen todos para cada cod 1,2,3,4 y 5.

Y si porfavor puediras explicarme como funciona tu consulta seria chevere, gracias.
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: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta sql

Publicado por Rafael (328 intervenciones) el 03/04/2014 18:03:25
Prueba con algo asi...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT QA.C1, MAX_C4 - MIN_C3
FROM
(
    SELECT C1,  MAX(C4)  AS MAX_C4
    FROM "TABLA" -- pon aqui el nombre de tu tabla, acuerdate quitar las comillas
    WHERE COD = 2
    GROUP BY C1
) QA,
(
    SELECT C1,  MIN(C3)  AS MIN_C3
    FROM "TABLA" -- pon aqui el nombre de tu tabla, acuerdate quitar las comillas
    WHERE COD = 1
    GROUP BY C1
) QB
WHERE QB.C1 = QA.C1 (*)

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
sin imagen de perfil

Consulta sql

Publicado por Ruben (5 intervenciones) el 08/04/2014 18:40:03
Gracias a ambos por su ayuda, use el codigo de luis pablo y lo generalize y funciono pero ahora tengo otra consutla, que publicare en otra pregunta en el foro.

nuevamente gracias a ambos, saludos!
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