2012-09-05 15 views
6

Tenemos 2 sentencias SELECT muy simples:ORACLE SQL obtener la diferencia de dos valores recuperados de 2 sentencias de selección

SELECT value from table where date between DATE1 and DATE2 
SELECT value from table where date between DATE3 and DATE4 

necesitamos una manera de escribir una única sentencia de SQL que obtendrá la diferencia del "valor" que se devuelve de estas dos declaraciones SQL.

Probamos el siguiente, pero no tuvo éxito:

SELECT value from table where date between DATE1 and DATE2 
minus 
SELECT value from table where date between DATE3 and DATE4 

Cualquier sugerencia es muy apreciada.

+1

¿Desea la diferencia numérica (siempre que ambos SELECT devuelvan solo una fila)? ¿O desea la diferencia establecida (es decir, todos los valores devueltos desde la declaración1 que no se devuelven desde la declaración2)? –

+0

necesito la diferencia numérica – Sanath

+2

Entonces debes aceptar la respuesta de trideceth12. –

Respuesta

15

no probado, pero debería funcionar:

SELECT 
    (SELECT value from table where date between DATE1 and DATE2) - 
    (SELECT value from table where date between DATE3 and DATE4) 
FROM dual; 

Suponiendo que su SELECT value está garantizado para devolver un solo valor

+0

¿qué hacer si no hay un solo valor? – BSeitkazin

+1

@Beezy El interlocutor preguntó acerca de obtener la diferencia entre dos valores. Si su selección obtiene más de un valor cada uno, debe agregar más condiciones hasta que obtenga solo los valores que desea incluir en el cálculo. – jsj

2
SELECT value FROM TBL WHERE date BETWEEN DATE1 and DATE2 
AND value NOT IN (SELECT value FROM TBL WHERE date BETWEEN DATE3 AND DATE4) 
1

Por favor, intente esto:

SET SERVEROUTPUT ON 
DECLARE 
V_FIRST NUMBER := 0; 
V_SECOND NUMBER := 0; 
BEGIN 
    SELECT value into V_FIRST from table where rownum=1 and date between DATE1 and DATE2; 
    SELECT value into V_SECOND from table where rownum=1 and date between DATE3 and DATE4; 

    DBMS_OUTPUT.PUT_LINE (V_FIRST-V_SECOND); 
END; 
1
(
SELECT value from table where date between DATE1 and DATE2 
minus 
SELECT value from table where date between DATE3 and DATE4 
) 
union all 
(
SELECT value from table where date between DATE3 and DATE4 
minus 
SELECT value from table where date between DATE1 and DATE2 
) 
1

A continuación la declaración sho ULD trabajo para su caso

(
SELECT value from table where date between DATE3 and DATE4 
minus 
SELECT value from table where date between DATE1 and DATE2 
) 
union 
(
SELECT value from table where date between DATE1 and DATE2 
minus 
SELECT value from table where date between DATE3 and DATE4 
) 
2

si considera que su consultas internas pueden dar múltiples valores, utilice a continuación

SELECT 
(SELECT sum(value) from table where date between DATE1 and DATE2) - 
(SELECT sum(value) from table where date between DATE3 and DATE4) as answer 

de la doble;

Cuestiones relacionadas