#sql #oracle #grouping-sets
#sql #Oracle #группировка-наборы
Вопрос:
Я вычисляю общую сумму, используя наборы группировок
SELECT
CASE
WHEN GROUPING(Name) = 1 THEN 'TOTAL' ELSE Name END,
ID,
SUM(Amount)
FROM Table1 GROUP BY GROUPING SETS ( (ID, Name), (ID) );
Я получу что-то вроде этого
ID Name Amount
11 company1 100
11 company1 200
11 TOTAL 300
22 company2 100
22 company2 200
22 TOTAL 300
Но я хочу изменить имя «TOTAL» на «comany1 -total» или «company2-total»
, например
ID Name Amount
11 company1 100
11 company1 200
11 company1-TOTAL 300
22 company2 100
22 company2 200
22 company2-TOTAL 300
Возможно ли это сделать? Я застрял на этом некоторое время. Спасибо!!!
Ответ №1:
это даст вам то, что вы хотите, с набором группировок:
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
;
Ответ №2:
Как насчет формулировки этого как:
SELECT (CASE WHEN GROUPING(Amount) = 1 THEN Name || '-TOTAL' ELSE Name END),
ID, SUM(Amount)
FROM Table1
GROUP BY GROUPING SETS ( (ID, Name, Amount), (ID, Name) );
Предполагается, что Amount
это уникально. Если нет, возможно, у вас есть другой уникальный столбец, который вы можете использовать.
Комментарии:
1. Но как насчет того, чтобы я все еще хотел сохранить идентификатор в столбце ID и сделать все другие столбцы такими, как Name ‘total’