【问题标题】:Multiplication of data in a hierarchy (oracle)层次结构中的数据乘法(oracle)
【发布时间】:2016-06-18 15:27:44
【问题描述】:

我正在做一个项目,但我遇到了一些困难。我现在可以检索数据,但我必须在计算中使用它。

我的实际代码是:

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);

【问题讨论】:

  • connect by fonds= prior opcvm 之后添加WHERE CONNECT_BY_ISLEAF = 1
  • 请您发布minimal reproducible example(即您的表的 DDL 语句和与您的输出匹配的一些示例数据的 DML)。
  • 您的代码在语法上无效。别名AA 在内部选择中,不能在外部选择中引用,并且存在不匹配的圆括号。请修复它并给我们一些示例数据。
  • 我试图简化,所以我删除了部分代码,我将更正它。感谢您的帮助。
  • 我更正了代码并添加了一些说明。如果您需要其他详细信息,请告诉我。谢谢。

标签: oracle hierarchy


【解决方案1】:

查询

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 

【讨论】:

  • 非常感谢MT0,我明天上班去测试这个解决方案。
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多