MySQL:计算一个ETF投资组合的加权持有量,结果得到一个包含所有累积持有量的列表

MySQL: calculate weighted holdings of an ETF portfolio with the result to get one list with all holdings accumulated

我有一个 MySQL table,其中包含大约 900 个不同 ETF 持有量的条目。这是一个例子:

ID    ETF Name                                       Stock Name           Weighting     ISIN
1     iShares Automation & Robotics                  XIAOMI CORP          3.45          KYG9830T1067
24    iShares Automation & Robotics                  SNAP INC CLASS A     3.37          US83304A1060       
42    iShares Automation & Robotics                  APPLE INC            2.14          US0378331005       
51    iShares MSCI World Information Technology      APPLE INC            20.14         US0378331005
53    iShares MSCI World Information Technology      MICROSOFT CORP       14.04         US5949181045

我现在的目标是设定 ETF 权重,例如 ETF iShares Automation & Robotics 20%,ETF iShares MSCI World Information Technology 80%。 SQL 查询现在应该做的是根据 20/80 ETF 多元化计算加权持有量。

例如,对于名为 Apple 的股票,结果将是:0.2 * 2.14 + 0.8 * 20.14 = 16.54。最后,我想要一个 table 删除所有重复项(通过 ISIN)并给我一个 table 计算权重按权重排序。

这是预期的输出(对于 20/80):

Stock Name            Weighting     ISIN
APPLE INC             16.54         US0378331005
MICROSOFT CORP        11.232        US5949181045
XIAOMI CORP           0.69          KYG9830T1067
SNAP INC CLASS A      0.674         US83304A1060

遗憾的是,我什至不知道从哪里开始...您可以使用 ISIN 来匹配股票,它代表 International Securities Identification Number 并且是一个唯一的股票 ID!

如有任何帮助,我将不胜感激!

您可以使用条件聚合来完成:

SELECT `Stock Name`,
       ROUND(SUM(CASE 
             WHEN `ETF Name` = 'iShares Automation & Robotics' THEN 0.2 
             WHEN `ETF Name` = 'iShares MSCI World Information Technology' THEN 0.8
           END * Weighting
       ), 3) Weighting,     
       ISIN 
FROM tablename
GROUP BY `Stock Name`, ISIN

参见demo
结果:

> Stock Name       | Weighting | ISIN        
> :--------------- | --------: | :-----------
> APPLE INC        |    16.540 | US0378331005
> MICROSOFT CORP   |    11.232 | US5949181045
> SNAP INC CLASS A |     0.674 | US83304A1060
> XIAOMI CORP      |     0.690 | KYG9830T1067