2016-06-18 5 views
-1

Я работаю над проектом, и я сталкиваюсь с некоторыми трудностями. Теперь я могу получить данные, но я должен использовать их в калории.Умножение данных в иерархии (оракул)

Мой фактический код:

with tree as 
(
select AA.PORTEFEUILLE, AA.fonds, round(AA.nbreparts , 7) parts, opcvm, level lev 
, SYS_CONNECT_BY_PATH(fonds, '/') Path 
, connect_by_root(fonds) leaf 
, connect_by_root(AA.nbreparts) detenus 
from dbo.chiffres AA 
connect by fonds= prior opcvm 

) 

select distinct tree.Portefeuille, lev, path, 
round(detenus/cc.nombre_parts_av_vl,7) weight, CC.frais 
from tree 
inner join dbo.histo_portef_fp_group CC on leaf=CC.portefeuille 
and CC.date_fp = to_date('25/03/2016','dd/mm/yyyy') 

resulat я получаю сейчас:

Portefeuille || LEV || Path || weight || frais 

5000   || 1 || /010 || 0,73%  || 100 
5000   || 2 || /001/010 || 0,39% || 300 
5000   || 2 || /013/010 || 0,09% || 200 
5000   || 3 || 211/013/010 || 2,79% || 150 

Но окончательное resulat, что я хочу это:

Portefeuille || LEV || Path || total 

5000   || 3 || 211/013/010 || 0,73%*100 + 0,73%*0,09%*200 + 0,73%*0,09%*2,79%+150 
5000   || 2 || /001/010 || 0,73%*100 + 0,73%*0,39%*300 

Я м с использованием 2 таблиц:

CREATE TABLE chiffres(
    Portefeuille nvarchar2(255), 
    Fonds  nvarchar2(255), 
    nbreparts float, 
    opcvm  nvarchar2(255) 
); 

и

CREATE TABLE histo_portef_fp_group(
    Portefeuille  nvarchar2(255), 
    date_fp   DATE, 
    nombre_parts_av_vl float, 
    frais float 
); 

и пример данных, чтобы получить результат выше:

INSERT INTO chiffres(Portefeuille,Fonds,nbreparts,opcvm) 
VALUES('5000','010',380, null); 

INSERT INTO chiffres(Portefeuille,Fonds,nbreparts,opcvm) 
VALUES('104827','211',3800,'013'); 

INSERT INTO chiffres(Portefeuille,Fonds, nbreparts,opcvm) 
VALUES('104823','013',3,'010'); 

INSERT INTO chiffres(Portefeuille,Fonds, nbreparts,opcvm) 
VALUES('104823','001',302,'010'); 

и

INSERT INTO histo_portef_fp_group(Portefeuille,date_fp, nombre_parts_av_vl, frais) 
VALUES('010', DATE '2016-03-25',52224, 100); 

INSERT INTO histo_portef_fp_group(Portefeuille,date_fp, nombre_parts_av_vl, frais) 
VALUES('013',DATE '2016-03-25',3175, 200); 

INSERT INTO histo_portef_fp_group(Portefeuille,date_fp, nombre_parts_av_vl, frais) 
VALUES('211',DATE '2016-03-25',136354, 150); 

INSERT INTO histo_portef_fp_group(Portefeuille,date_fp, nombre_parts_av_vl, frais) 
VALUES('001',DATE '2016-03-25',76449, 300); 
+0

Добавить 'WHERE CONNECT_BY_ISLEAF = 1' только после того, как' соединить путем Fonds = предварительного opcvm ' – krokodilko

+0

Пожалуйста, вы можете оставить [MCVE] (т.е. оператор DDL для ваших таблиц и DML для некоторых примеров данных, соответствующих вашему результату). – MT0

+0

Ваш синтаксически недействительный код. Алиас 'AA' находится во внутреннем выборе и на него нельзя ссылаться во внешнем выборе, и есть круглые скобки с непревзойденным расположением. Пожалуйста, исправьте это и дайте нам некоторые данные образца. – MT0

ответ

0

Query:

WITH data (fonds, opcvm, portefeuille, lvl, path, weight, frais, isleaf) AS (
    SELECT fonds, 
     opcvm, 
     CONNECT_BY_ROOT(c.portefeuille), 
     LEVEL, 
     SYS_CONNECT_BY_PATH(fonds, '/'), 
     ROUND(CONNECT_BY_ROOT(c.nbreparts)/h.nombre_parts_av_vl, 7), 
     frais, 
     CONNECT_BY_ISLEAF 
    FROM chiffres c 
     INNER JOIN 
     histo_portef_fp_group h 
     ON (c.fonds = h.portefeuille) 
    START WITH opcvm IS NULL 
    CONNECT BY PRIOR fonds = opcvm 
) 
SELECT portefeuille, 
     lvl, 
     path, 
     (SELECT SUM(
        (SELECT EXP(SUM(LN(weight))) 
        FROM data ddd 
        START WITH ddd.fonds = dd.fonds 
        CONNECT BY PRIOR opcvm = fonds 
       ) 
        * frais 
       ) 
     FROM data dd 
     START WITH dd.fonds = d.fonds 
     CONNECT BY PRIOR opcvm = fonds) AS total 
FROM data d 
WHERE isleaf = 1; 

Выход:

PORTEFEUILLE LVL PATH   TOTAL 
------------ --- ------------ ---------- 
5000   2 /010/001  .738480273 
5000   3 /010/013/211 .902166845 
+0

Большое спасибо MT0, я собираюсь протестировать это решение завтра на работе. – Lamia

 Смежные вопросы

  • Нет связанных вопросов^_^