首页 > 解决方案 > 累积投资组合摘要

问题描述

我在mysql中有两个表。所有日期均以 yyyy-mm-dd 表示。如果有人了解共同基金,这个问题就会很清楚。

  1. NAVMaster - 存储方案的 NAV。资产净值每天都在变化,节假日和周末除外。
    +------------+--------------+-------+  
    | schemecode |   navdate    |  nav  |  
    +------------+--------------+-------+  
    |          1 |   2020-01-01 |    10 |  
    |          2 |   2020-01-01 |    10 |  
    |          3 |   2020-01-01 |    10 |  
    |          1 |   2020-01-02 |    11 |  
    |          2 |   2020-01-02 |    11 |  
    |          3 |   2020-01-02 |    11 |  
    |          1 |   2020-01-06 |    25 |  
    |          2 |   2020-01-06 |    25 |  
    |          3 |   2020-01-06 |    25 |  
    +------------+--------------+-------+  

insert into navmaster(schemecode,navdate,nav) values 
(1,'2020-01-01', 10),  
(2,'2020-01-01', 10),  
(3,'2020-01-01', 10),  
(1,'2020-01-02', 11),  
(2,'2020-01-02', 11),  
(3,'2020-01-02', 11),  
(1,'2020-01-06', 25),  
(2,'2020-01-06', 25),  
(3,'2020-01-06', 25)
  1. 交易 - 存储用户完成的交易。当用户购买金额为 purchamount 的方案时。他将根据交易日的资产净值(Purchamount/nav=units)分配单位
+------------+------------+-----------------+-----+-------+  
| trdate     | schemecode |     purchamount | nav | units |  
+------------+------------+-----------------+-----+-------+  
| 2020-01-01 |     2      |     1000        | 10  | 100   |  
+------------+------------+-----------------+-----+-------+  
| 2020-01-01 |     1      |     1000        | 10  | 100   |  
+------------+------------+-----------------+-----+-------+  
| 2020-01-02 |     1      |     1100        | 11  | 100   |  
+------------+------------+-----------------+-----+-------+  
| 2020-01-02 |     2      |     880         | 11  | 80    |  
+------------+------------+-----------------+-----+-------+  
| 2020-01-06 |     3      |     2000        | 25  | 80    |  
+------------+------------+-----------------+-----+-------+  
| 2020-01-06 |     1      |     1000        | 25  | 40    |  
+------------+------------+-----------------+-----+-------+  


insert into transactions(trdate,schemecode purchamount,nav, units)  
('2020-01-01',2,1000,10,100),  
('2020-01-01',1,1000,10,100),  
('2020-01-02',1,1100,11,100),  
('2020-01-02',2, 880,11,80),  
('2020-01-06',3,2000,25,80),  
('2020-01-06',1,1000,25,40)  

我需要展示每天用户投资的变化。价值是根据(累计单位余额)*(当天的导航)计算的。

例子:

  1. 2020 年 1 月 1 日,用户在方案 2 中投资了 1000,在方案 1 中投资了 1000。他在每个方案中获得了 100 个单位。2020-01-01投资金额为2000,价值为2000。
  2. 2020-01-02,用户在方案1中投资了1100,在方案2中投资了880。他在方案1中获得了100个单位,在方案2中获得了80个单位。投资金额3980,价值4180(sch1 units-200*11)+(sch2 units-180*11)
  3. 2020-01-03、2020-01-04、2020-01-05 是假期。所以不会计算资产净值。这些假期显示前几天的值,即 2020-01-02 值。
  4. 2020-01-06,用户在scheme3中投资了2000,在scheme 1中投资了1000,在scheme3中获得了80个units,在scheme1中获得了40个units。投资金额6980,价值12500(sch1 units-240*25 +sch2 units-180*25 +sch3 units-80*25)

+----------------------+-----------+  
|  date  | invested  | value  |  
+----------------------+-----------+--------+  
| 2020-01-01  |  2000  |  2000  |  
| 2020-01-02  |  3980  |  4180  |  
| 2020-01-03(Holiday) | 3980  |  4180  |  
| 2020-01-04(Holiday)  |  3980  |  4180  |  
| 2020-01-05(Holiday)  |  3980  |  4180  |  
| 2020-01-06  |  6980  | 12500  |  
+----------------------+-----------+--------+  

我已经到达这里:

select a.navdate, sum(b.units) as cumulative_sales
from navmaster a join transactions b on a.navdate >= b.trdate and a.schemecode=b.schemecode
group by a.navdate order by a.navdate

任何帮助,将不胜感激。

谢谢

标签: mysql

解决方案


这就是我所拥有的。我认为它更接近你想要的,但它并没有给出与你所拥有的相同的答案。您如何知道方案 2 的 1/6 的导航?

select
   trdate,
   invested,
   sum(holding) value 
from
   (
      select
         trdate,
         (
            select
               sum(purchamount) 
            from
               transactions 
            where
               trdate <= t2.trdate
         )
         invested,
         schemecode,
         (
            select
               nav 
            from
               transactions 
            where
               trdate = t2.trdate 
               and schemecode = t2.schemecode
         )
         * (
         select
            sum(units) 
         from
            transactions 
         where
            trdate <= t2.trdate 
            and schemecode = t2.schemecode) holding 
         from
            transactions t2 
   )
   t1 
group by
   trdate

结果是

trdate                  invested    value
2020-01-01T00:00:00Z    2000        2000
2020-01-02T00:00:00Z    3980        4180
2020-01-06T00:00:00Z    6980        8000

推荐阅读