我在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语句。
答案 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子句,该子句引用查询投影中的所有非聚合列。