oracle中的解码语句对结果的值求和

时间:2017-03-24 03:08:14

标签: oracle

我在Oracle中有一个解码语句:

DECODE(a.part,'0001',NVL(b.q1,0),
              '0002',NVL(b.q1,0),
              '0003',NVL(b.q1,0),
              '0004',NVL(b.q1,0),0) q1,

条件是,如果有任何标准" 0001"到" 0004"符合b.q1将是q1的其他值0.

我的问题是" 0001"和" 0002"满足q1的值应该是满足的两个条件的总和。 DECODE是否会添加结果的值?我想要实现的是,如果满足其中一个条件,则取b.q1的值并分配给q1。我在考虑IF-ELSE条件下的OR语句。

1 个答案:

答案 0 :(得分:1)

DECODE()是一个转换函数。它为提交的每一行吐出一行。它类似于更一般的CASE功能。

要汇总值,您需要一个聚合函数,在这种情况下SUM()...

sum(DECODE(a.part,'0001',NVL(b.q1,0),
          '0002',NVL(b.q1,0),
          '0003',NVL(b.q1,0),
          '0004',NVL(b.q1,0),0)) as q1

或者,在这里使用CASE因为输入较少:

sum( case
       when a.part in ('0001','0002','0003','0004')
            and b.q1 is not null
       then b.q1
       else 0 end) as q1

您只提供了一个查询片段。您很可能需要进行其他更改以适应聚合。具体而言,您需要在查询中添加GROUP by子句,该子句引用查询投影中的所有非聚合列。