Возвращает желаемый результат:
signs
CTE выясняет, есть ли положительные / отрицательные значения, а также максимальное значение энергии ABS - , тогда существует объединение двух выбирает: ту, которая возвращает «исходные» строки (если число отличительных знаков равно 1), и ту, которая возвращает «вычисленные» значения, как вы описали
SQL> with
2 signs as
3 (select unit,
4 count(distinct sign(energy)) cnt,
5 max(abs(energy)) max_abs_ene
6 from tab
7 group by unit
8 )
9 select t.unit, t.price, t.energy
10 from tab t join signs s on t.unit = s.unit
11 where s.cnt = 1
12 union all
13 select t.unit, t2.price, sum(t.energy)
14 from tab t join signs s on t.unit = s.unit
15 join tab t2 on t2.unit = s.unit and abs(t2.energy) = s.max_abs_ene
16 where s.cnt = 2
17 group by t.unit, t2.price
18 order by unit;
UNIT PRICE ENERGY
-------------------- ---------- ----------
A 20 -50
A 50 -80
B 13 -15
SQL>
Хотя, что делать Вы ожидаете, что будет еще одна строка "B" с energy = +50
? Тогда две строки будут иметь одинаковое значение MAX(ABS(ENERGY))
.