2015-08-13 3 views
0

У меня есть таблица, которую я хочу заполнить двумя разными столбцами: prop1 и prop2.Oracle SQL - Производить несколько различных агрегаций с использованием аналитических функций?

id | prop1 | prop2 | val 
-------------------------- 
1 | A  | B  | 10 
2 | A  | A  | 15 
3 | B  | B  | 20 
4 | B  | A  | 30 

Нужный выход:

prop_name | prop_val | sum_val 
-------------------------------- 
prop1  | A  | 25 
prop1  | B  | 50 
prop2  | A  | 45 
prop2  | B  | 30 

Я знаю, что могу сделать это с помощью объединения (смотри ниже), но есть лучший способ, используя аналитические функции?

with 
    test_data as (
     select 1 as id, 'A' as prop1, 'B' as prop2, 10 as val from dual union all 
     select 2 as id, 'A' as prop1, 'A' as prop2, 15 as val from dual union all 
     select 3 as id, 'B' as prop1, 'B' as prop2, 20 as val from dual union all 
     select 4 as id, 'B' as prop1, 'A' as prop2, 30 as val from dual 
) 
select 
    'prop1' as prop_name 
    , prop1 as prop_val 
    , sum(val) as sum_val 
from test_data 
group by 'prop1', prop1 

union all 

select 
    'prop2' as prop_name 
    , prop2 as prop_val 
    , sum(val) as sum_val 
from test_data 
group by 'prop2', prop2; 

ответ

0

Я хотел бы сделать это с помощью группировки множеств:

select prop1, prop2, sum(val) 
from test_data 
group by grouping sets ((prop1), (prop2)) 

Here Ваш пример.

Для получения точного результата требуется немного больше работы.

select (case when prop1 is null then 'prop2' else 'prop1' end) as prop_name, 
     coalesce(prop1, prop2) as prop, 
     sum(value) 
from test_data 
group by grouping sets ((prop1), (prop2)); 

Это предполагает, что первые два столбца не содержат NULL значения. Лучший способ выразить логику - использовать GROUPING_ID или GROUP_ID(), но я думаю, что логике легче следовать с COALESCE().