with Tab_X (Col_1, Col_2, Col_3) as (
select 'A1', 'B1', 10 from dual union all
select 'A1', 'B2', 7 from dual union all
select 'A2', 'B1', 15 from dual union all
select 'A2', 'B2', 6 from dual
)
select *
from Tab_X
union all -- UPDATE, thanks @GordonLinoff
select Col_1
, null
, sum(Col_3 * case when Col_2 = 'B1' then 1 else -1 end)
from Tab_X
group by Col_1;
Комментарии:
- пожалуйста, используйте CTE (с предложением) в вашей входной спецификации, чтобы сделать ответ более удобным
- пожалуйста, отметьте вопрос поставщика БД. Из тега
plsql
, я думаю, у вас есть Oracle, в котором, к сожалению, нет предложения filter (where)
, поэтому обходной путь sum (case when)
- может быть решен также с использованием
group by rollup
, но я не мог его придумать
ОБНОВЛЕНИЕ: решение на основе group by rollup
with Tab_X (Col_1, Col_2, Col_3) as (
select 'A1', 'B1', 10 from dual union all
select 'A1', 'B2', 7 from dual union all
select 'A2', 'B1', 15 from dual union all
select 'A2', 'B2', 6 from dual
)
select Col_1
, null
, case
when grouping(Col_2) = 1 then sum(Col_3 * case when Col_2 = 'B1' then 1 else -1 end)
else min(Col_3)
end as Col_3
from Tab_X
group by Col_1, rollup (Col_2)