我正在开展一个项目,面临一些困难。我现在能够检索数据,但我必须在计算中使用它。
我的实际代码是:
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')
我现在得到的结果是:
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
但我想要的最终结果是:
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 :(得分:0)
<强>查询强>:
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