【问题标题】:Make a difference between two results在两个结果之间产生差异
【发布时间】:2018-04-25 16:03:22
【问题描述】:

我需要对这 2 个查询的结果进行区分。

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。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    使用case 表达式进行条件聚合。 SUM 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 子句中保留了计算 ID 条件。可以加快速度。

    【讨论】:

      【解决方案2】:

      使用条件聚合

      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'
      

      【讨论】:

      • 逻辑正确,但抛出语法错误。感谢您的反馈
      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2021-12-10
      • 2021-12-31
      • 2021-05-24
      • 1970-01-01
      相关资源
      最近更新 更多