mysql - 累积投资组合摘要
问题描述
我在mysql中有两个表。所有日期均以 yyyy-mm-dd 表示。如果有人了解共同基金,这个问题就会很清楚。
- 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)
- 交易 - 存储用户完成的交易。当用户购买金额为 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)
我需要展示每天用户投资的变化。价值是根据(累计单位余额)*(当天的导航)计算的。
例子:
- 2020 年 1 月 1 日,用户在方案 2 中投资了 1000,在方案 1 中投资了 1000。他在每个方案中获得了 100 个单位。2020-01-01投资金额为2000,价值为2000。
- 2020-01-02,用户在方案1中投资了1100,在方案2中投资了880。他在方案1中获得了100个单位,在方案2中获得了80个单位。投资金额3980,价值4180(sch1 units-200*11)+(sch2 units-180*11)
- 2020-01-03、2020-01-04、2020-01-05 是假期。所以不会计算资产净值。这些假期显示前几天的值,即 2020-01-02 值。
- 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
任何帮助,将不胜感激。
谢谢
解决方案
这就是我所拥有的。我认为它更接近你想要的,但它并没有给出与你所拥有的相同的答案。您如何知道方案 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
推荐阅读
- html - 通过电子邮件发送的可操作消息在 Outlook 中显示空内容
- c# - 如何更改缓存中的项目
- ruby-on-rails - 单元测试:如何测试是否调用了 Rails 迁移?
- encryption - HSM解密+加密链接
- c# - 如何将 web api 结果显示到下拉列表控件?
- android - 如何在 kotlin/android.. 中只显示时间而不是日、月、时间和 GMT?
- list - Haskell 扁平化字符串列表
- ios - App Store Connect 创建配置文件错误 500
- javascript - Highchart 类型:X-Range 两个数据集之间没有空格
- java - 找出所有 0 和所有 1 在一起所需的最小交换次数