2016-07-06 4 views
1

У меня есть следующая таблица структура. Я хотел бы получить сумму на каждом уровне от TAB2.Сумма запроса иерархии на каждом уровне

TAB1 хранит иерархию в столбцах уровня.

TAB1 
----- ----- ---- ---- 
KEY L1  L2 L3 
---- ----- ----- ---- 
A  A 
B  A  B 
C  A  B  C 
D  A  B  D 

TAB2 
----- 
KEY TC 
---- ---- 
A  10 
B  11 
C  6 
D  12 
X  11 

Expected Output: 

KEY SUM 
---- ---- 
A 39 
B 29 
C 6 
D 12 
X 11 

Вот SQLFiddle Ссылка: LINK TO FIDDLE

+0

Здесь отличное место, чтобы начать. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Пожалуйста, укажите желаемый результат для этих данных, так как неясно, что вы имеете в виду * сумму на каждом уровне *. Я думаю о по крайней мере 3 интерпретациях этого. – trincot

+0

Добавление в комментарий trincot - не просто предоставить желаемый результат, объясните на английском языке (нет кода!) КАК этот вывод должен быть получен. – mathguy

ответ

1

Oracle Setup

Create table TAB1 (pKey varchar2(10),level1 varchar2(10),level2 varchar2(10),level3 varchar2(10),level4 varchar2(10)); 
insert into TAB1(pKey,level1) values('A','A'); 
insert into TAB1(pKey,level1,level2) values('B','A','B'); 
insert into TAB1(pKey,level1,level2,level3) values('C','A','B','C'); 
insert into TAB1(pKey,level1,level2,level3) values('D','A','B','D'); 

Create table TAB2 (pKey varchar(10), tc integer); 
insert into TAB2(pKey,tc) values('A',10); 
insert into TAB2(pKey,tc) values('B',11); 
insert into TAB2(pKey,tc) values('C',6); 
insert into TAB2(pKey,tc) values('D',12); 
insert into TAB2(pKey,tc) values('X',11); 

Запрос:

SELECT t2.pKey, 
     SUM(COALESCE(t4.TC, t2.tc)) AS tc 
FROM tab2 t2 
     LEFT OUTER JOIN 
     tab1 t1 
     ON (t2.pKey = t1.pKey) 
     LEFT OUTER JOIN 
     tab1 t3 
     ON ( t1.level1 = t3.level1 
      AND (t1.level2 IS NULL OR t1.level2 = t3.level2) 
      AND (t1.level3 IS NULL OR t1.level3 = t3.level3) 
      AND (t1.level4 IS NULL OR t1.level4 = t3.level4)) 
     LEFT OUTER JOIN 
     tab2 t4 
     ON (t3.pKey = t4.pKey) 
GROUP BY t2.pKey; 

Ou tput:

PKEY    TC 
---------- ---------- 
D     12 
A     39 
B     29 
C     6 
X     11 
1

В растворе, представленный ниже (в том числе входных данных как факторизованные подзапросы), сначала я показать, как использовать unpivot и дополнительные операции по нормализации tab1 (результат является факторизованными подзапросами n для "n ormalized «). Затем, если бы у вас были данные в нормальной форме, выход мог быть получен прямым непосредственным применением стандартного иерархического запроса, как показано в нижней части моего кода.

with 
    tab1 (key, L1, L2, L3) as (
     select 'A', 'A', null, null from dual union all 
     select 'B', 'A', 'B' , null from dual union all 
     select 'C', 'A', 'B' , 'C' from dual union all 
     select 'D', 'A', 'B' , 'D' from dual 
    ), 
    tab2 (key, TC) as (
     select 'A', 10 from dual union all 
     select 'B', 11 from dual union all 
     select 'C', 6 from dual union all 
     select 'D', 12 from dual union all 
     select 'X', 11 from dual 
    ), 
    unpiv (key, l, ancestor) as (
     select key, to_number(substr(lv, 2)), ancestor from tab1 
     unpivot (ancestor for lv in (L1, L2, L3)) 
    ), 
    d (key, depth) as (
     select key, max(l) 
     from unpiv 
     group by key 
    ), 
    n (child, parent, TC) as (
     select d.key, u.ancestor, tab2.TC 
     from unpiv u 
      right outer join d 
       on u.key = d.key and u.l = d.depth - 1 
      left outer join tab2 
       on d.key = tab2.key 
    ) 
SELECT key, sum(TC) as sum_TC 
from (
    select connect_by_root child as key, TC 
    from n 
    connect by prior child = parent 
) 
group by key 
order by key; 

По пути, в unpiv, я уже все родитель-потомок, так что я мог присоединиться, что непосредственно tab2 на unpiv.key = tab2.key и суммируется TC группировку ancestor (аналогично решению mt0 в). Вместо этого я хотел продемонстрировать два отдельных шага: (1) нормализация tab1 и (2) насколько просто использовать иерархические запросы для нормализованных таблиц.

Выход:

KEY  SUM_TC 
--- ---------- 
A   39 
B   29 
C   6 
D   12 
Смежные вопросы