在两个结果之间做出改变

时间:2018-04-25 07:54:48

标签: sql oracle

我需要在这两个查询的结果之间做出改变。

SELECT SUM(overwritten_ecl+ overwritten_ecl_off) A1
FROM llpa.h_rt_ifrs_provision
WHERE calculation_id = 1624
AND stage = 1
AND id_rip_code = 'HOPISD'
AND actual_urg = '0.5'

和这一个

SELECT SUM(overwritten_ecl+ overwritten_ecl_off) A2
FROM llpa.h_rt_ifrs_provision
WHERE calculation_id = 1652
AND stage = 1
AND id_rip_code = 'HOPISD'
AND actual_urg = '0.5'

第一个查询的结果是:123456,第二个查询结果是:2345678。 我需要做的是123456 - 2345678之间的简单区别。 如何使用一个查询来完成?我尝试了MINUS运算符,但它没有用。 我正在使用ORACLE SQL。

2 个答案:

答案 0 :(得分:3)

使用case表达式进行条件聚合。正值为1624 id的正值和1652 id的负值。

SELECT SUM(case calculation_id
             when 1624 then  overwritten_ecl + overwritten_ecl_off
             when 1652 then -overwritten_ecl - overwritten_ecl_off
             else 0
           end)
FROM llpa.h_rt_ifrs_provision
WHERE calculation_id IN (1624, 1652)
AND stage = 1
AND id_rip_code = 'HOPISD'
AND actual_urg = '0.5'

基本上与Radim相同的答案,除了我在WHERE子句中保留了calculate_id条件。可以加快速度。

答案 1 :(得分:0)

使用条件聚合

SELECT SUM(CASE WHEN calculation_id = 1624 THEN overwritten_ecl+ overwritten_ecl_off ELSE 0 END)  - 
       SUM(CASE WHEN calculation_id = 1652 THEN overwritten_ecl+ overwritten_ecl_off ELSE 0 END)  diference
FROM llpa.h_rt_ifrs_provision
WHERE stage = 1
    AND id_rip_code = 'HOPISD'
    AND actual_urg = '0.5'