Как суммировать несколько значений DECODE? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть следующие декодеры в моем случае 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 голосов
/ 22 мая 2019

Я бы просто написал:

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');

В дополнение к использованию стандартного синтаксиса CASE (а не сделанного на заказ и устаревшего decode), он все равно будет предоставлять сумму, если какой-либо из table_name отсутствует в данных.

Oracle имеет хороший оптимизатор, но фильтрация перед агрегированием может повысить производительность.

0 голосов
/ 22 мая 2019

На самом деле, вероятно, должно было быть наоборот: 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 может потребоваться использовать функцию.

...