это даст вам то, что вы хотите с набором группировки:
with test_table as (
select 11 ID, 'company1' Name, 100 Amount from dual union all
select 11 ID, 'company1' Name, 200 Amount from dual union all
select 22 ID, 'company2' Name, 100 Amount from dual union all
select 22 ID, 'company2' Name, 200 Amount from dual
)
SELECT
CASE
WHEN GROUPING(AMOUNT) = 1 THEN NAME||'-TOTAL' ELSE Name END,
ID,
SUM(Amount)
FROM test_table
GROUP BY GROUPING SETS ( (ID, Name, AMOUNT), (ID, NAME));
, и это еще один способ для этого:
with test_table as (
select 11 ID, 'company1' Name, 100 Amount from dual union all
select 11 ID, 'company1' Name, 200 Amount from dual union all
select 22 ID, 'company2' Name, 100 Amount from dual union all
select 22 ID, 'company2' Name, 200 Amount from dual
)
select id, name, amount from (
SELECT
ID,
name,
Amount
FROM test_table
union all
select id, name || '-TOTAL', sum(amount) from test_table group by id, name || '-TOTAL'
) order by id, name, amount
;