如何求和多个DECODE值?

时间:2019-05-22 07:34:52

标签: sql oracle sum decode

在SELECT情况下,我具有以下解码方式:

DECODE (table_name, 'RECHNUNG', SUM(beleg_betrag_offen) ) as re_be_of,
DECODE (table_name, 'GUTSCHRIFT', SUM(beleg_betrag_offen) ) as gs_be_of,
DECODE (table_name, 'ZAHLUNG', SUM(beleg_betrag_offen) ) as za_be_of

我想将这3个值加起来(每个DECODE总是有一些结果),但我不能。当我写一个简单的

re_be_of + gs_be_of + za_be_of

我什至看不到任何结果。有人知道我的错误在哪里吗?

2 个答案:

答案 0 :(得分:0)

实际上,应该反之亦然:SUM(DECODE),而不是DECODE(SUM),例如

with temp as
  (select sum(decode(table_name, 'RECHNUNG'  , beleg_betrag_offen)) as re_be_of,
          sum(decode(table_name, 'GUTSCHRIFT', beleg_betrag_offen)) as gs_be_of,
          sum(decode(table_name, 'ZAHLUNG'   , beleg_betrag_offen)) as za_be_of
   from your_table
  )
select re_be_of,
       gs_be_of,
       za_be_of,
       --
       re_be_of + gs_be_of + za_be_of total
from temp       

NVL功能可能需要使用。

答案 1 :(得分:0)

我会简单地写:

select sum(case when table_name = 'RECHNUNG' then beleg_betrag_offen
           end) as re_be_of,
       sum(case when table_name = 'GUTSCHRIFT' then beleg_betrag_offen
           end) as gs_be_of,
       sum(case when table_name = 'ZAHLUNG' then beleg_betrag_offen
           end) as za_be_of,
       sum(beleg_betrag_offen) as total
from your_table
where table_name in ('RECHNUNG', 'GUTSCHRIFT', 'ZAHLUNG');

除了使用 standard CASE语法(而不是定制和过时的decode)之外,如果有任何table_name,这仍将提供总和数据中缺少。

Oracle有一个很好的优化程序,但是在聚合之前过滤 可能会提高性能。