I have a table MF_NAVs which holds daily NAVs of mutual funds. I want to calculate the absolute returns over 1 day, 7 day, 15 days, 1 month, 3 month, 6 month, 1 year, 3 year, 5 year & since inception. And then INSERT the calculated values into another table MF_Returns.
The table structure and sample data for MF_NAVs is given below. I have also created a fiddle at the following link : https://www.db-fiddle.com/f/fYam96yYZo5tQLGLtcbhaQ/1
I use the SELECT query given below to calculate the absolute returns. The result from this query is also given below. My problem is I’m unable to save the result of this query into the MF_RETURNS table [structure given below].
The MF_NAVs table has around 20k different SchemeCode. Each SchemeCode has NAVs for different periods ranging from past few days to several months.
Please help save the calculated returns into MF_Returns table.
Query to calculate returns:
SELECT SchemeCode,Date,NetAssetValue, ROUND((((L.LatestNAV)-NetAssetValue)/NetAssetValue)*100,2) AS AbsoluteReturns FROM MF_NAVs JOIN (SELECT NetAssetValue AS LatestNAV FROM MF_NAVs WHERE SchemeCode=120503 ORDER BY DATE DESC LIMIT 1) AS L WHERE SchemeCode=120503 AND FIND_IN_SET( Date, ( SELECT CONCAT_WS( ',', Y.MaxDate, #LatestDate - MaxDate DATE_FORMAT(NOW() ,'%Y-01-01'), #YTD - Year To Datw MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 DAY THEN Date END), #1Day MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 7 DAY THEN Date END), #7Day MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 15 DAY THEN Date END), #15Day MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 MONTH THEN Date END), #1Month MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 3 MONTH THEN Date END), #3Month MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 6 MONTH THEN Date END), #6Month MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 YEAR THEN Date END), #1Year MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 3 YEAR THEN Date END), #3Year MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 5 YEAR THEN Date END), #5Year MIN(Date) #Inception ) FROM MF_NAVs JOIN (SELECT MAX(Date) AS MaxDate FROM MF_NAVs WHERE SchemeCode=120503) AS Y WHERE SchemeCode=120503 ) ) ORDER BY Date DESC
Table Structure : MF_NAVs
CREATE TABLE `MF_NAVs` ( `ID` int(11) NOT NULL, `SchemeCode` int(11) NOT NULL, `Date` date NOT NULL, `NetAssetValue` decimal(15,5) NOT NULL )
Sample Data: MF_NAVs
+------------+------------+---------------+ | SchemeCode | Date | NetAssetValue | +------------+------------+---------------+ | 120503 | 2021-04-13 | 65.59480 | +------------+------------+---------------+ | 120503 | 2021-04-12 | 65.22200 | +------------+------------+---------------+ | 120503 | 2021-04-09 | 67.70330 | +------------+------------+---------------+ | 120503 | 2021-04-08 | 67.89580 | +------------+------------+---------------+ | 120503 | 2021-04-06 | 66.39850 | +------------+------------+---------------+ | 120503 | 2021-04-05 | 66.11320 | +------------+------------+---------------+ | 120503 | 2021-04-01 | 67.03710 | +------------+------------+---------------+ | 120503 | 2021-03-26 | 65.79040 | +------------+------------+---------------+ | 120503 | 2021-03-25 | 64.86400 | +------------+------------+---------------+ | 120503 | 2021-03-12 | 68.38530 | +------------+------------+---------------+ | 120503 | 2021-03-09 | 68.54100 | +------------+------------+---------------+ | 120503 | 2021-01-13 | 66.05340 | +------------+------------+---------------+ | 120503 | 2021-01-12 | 66.90930 | +------------+------------+---------------+ | 120503 | 2021-01-08 | 66.77000 | +------------+------------+---------------+ | 120503 | 2021-01-01 | 64.98200 | +------------+------------+---------------+ | 120503 | 2020-10-13 | 51.78950 | +------------+------------+---------------+ | 120503 | 2020-10-12 | 52.00310 | +------------+------------+---------------+ | 120503 | 2020-10-09 | 52.06840 | +------------+------------+---------------+ | 120503 | 2013-01-02 | 15.02530 | +------------+------------+---------------+ | 120503 | 2016-04-08 | 29.94380 | +------------+------------+---------------+ | 120503 | 2016-04-12 | 30.46710 | +------------+------------+---------------+ | 120503 | 2016-04-13 | 30.94700 | +------------+------------+---------------+ | 120503 | 2018-04-09 | 44.67440 | +------------+------------+---------------+ | 120503 | 2018-04-12 | 45.10190 | +------------+------------+---------------+ | 120503 | 2018-04-13 | 45.18520 | +------------+------------+---------------+ | 120503 | 2020-04-09 | 43.82900 | +------------+------------+---------------+ | 120503 | 2020-04-13 | 42.89580 | +------------+------------+---------------+
Table Structure : MF_RETURNS
CREATE TABLE MF_RETURNS ( `ID` int(11) NOT NULL, `SchemeCode` int(11) NOT NULL, `LatestDate` date NOT NULL, `YTDDate` date NOT NULL, `YTDAbsoluteReturns` decimal(15,5) NOT NULL, `1DayDate` date NOT NULL, `1DayAbsoluteReturns` decimal(15,5) NOT NULL, `7DayDate` date NOT NULL, `7DayAbsoluteReturns` decimal(15,5) NOT NULL, `15DayDate` date NOT NULL, `15DayAbsoluteReturns` decimal(15,5) NOT NULL, `1MonthDate` date NOT NULL, `1MonthAbsoluteReturns` decimal(15,5) NOT NULL, `3MonthDate` date NOT NULL, `3MonthAbsoluteReturns` decimal(15,5) NOT NULL, `6MonthDate` date NOT NULL, `6MonthAbsoluteReturns` decimal(15,5) NOT NULL, `1YearDate` date NOT NULL, `1YearAbsoluteReturns` decimal(15,5) NOT NULL, `3YearDate` date NOT NULL, `3YearAbsoluteReturns` decimal(15,5) NOT NULL, `5YearDate` date NOT NULL, `5YearAbsoluteReturns` decimal(15,5) NOT NULL PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query Output
+------------+------------+---------------+-----------------+ | SchemeCode | Date | NetAssetValue | AbsoluteReturns | +------------+------------+---------------+-----------------+ | 120503 | 2021-04-13 | 65.59480 | 0.00 | +------------+------------+---------------+-----------------+ | 120503 | 2021-04-12 | 65.22200 | 0.57 | +------------+------------+---------------+-----------------+ | 120503 | 2021-04-06 | 66.39850 | -1.21 | +------------+------------+---------------+-----------------+ | 120503 | 2021-03-26 | 65.79040 | -0.30 | +------------+------------+---------------+-----------------+ | 120503 | 2021-03-12 | 68.38530 | -4.08 | +------------+------------+---------------+-----------------+ | 120503 | 2021-01-13 | 66.05340 | -0.69 | +------------+------------+---------------+-----------------+ | 120503 | 2021-01-01 | 64.98200 | 0.94 | +------------+------------+---------------+-----------------+ | 120503 | 2020-10-13 | 51.78950 | 26.66 | +------------+------------+---------------+-----------------+ | 120503 | 2020-04-13 | 42.89580 | 52.92 | +------------+------------+---------------+-----------------+ | 120503 | 2018-04-13 | 45.18520 | 45.17 | +------------+------------+---------------+-----------------+ | 120503 | 2016-04-13 | 30.94700 | 111.96 | +------------+------------+---------------+-----------------+ | 120503 | 2013-01-02 | 15.02530 | 336.56 | +------------+------------+---------------+-----------------+
Advertisement
Answer
ONLY TEMP SAMPLE. I will correct it after some questions are cleared.
SELECT null as ID, SchemeCode , MAX( IF(id=3, r.`Date`,null) ) AS 1DayDate , MAX( IF(id=3, r.`AbsoluteReturns`,null) ) AS 1DayAbsoluteReturns , MAX( IF(id=4, r.`Date`,null) ) AS 7DayDate , MAX( IF(id=4, r.`AbsoluteReturns`,null) ) AS 7DayAbsoluteReturns , MAX( IF(id=5, r.`Date`,null) ) AS 15DayDate , MAX( IF(id=5, r.`AbsoluteReturns`,null) ) AS 15DayAbsoluteReturns , MAX( IF(id=6, r.`Date`,null) ) AS 1MonthDate , MAX( IF(id=6, r.`AbsoluteReturns`,null) ) AS 1MonthAbsoluteReturns , MAX( IF(id=7, r.`Date`,null) ) AS 3MonthDate , MAX( IF(id=7, r.`AbsoluteReturns`,null) ) AS 3MonthAbsoluteReturns , MAX( IF(id=9, r.`Date`,null) ) AS 6MonthDate , MAX( IF(id=8, r.`AbsoluteReturns`,null) ) AS 6MonthAbsoluteReturns , MAX( IF(id=10, r.`Date`,null) ) AS 1YearDate , MAX( IF(id=10, r.`AbsoluteReturns`,null) ) AS 1YearAbsoluteReturns , MAX( IF(id=11, r.`Date`,null) ) AS 3YearDate , MAX( IF(id=11, r.`AbsoluteReturns`,null) ) AS 3YearAbsoluteReturns , MAX( IF(id=12, r.`Date`,null) ) AS 5YearDate , MAX( IF(id=12, r.`AbsoluteReturns`,null) ) AS 5YearAbsoluteReturns FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY `SchemeCode` order by `Date` desc ) AS id, SchemeCode,Date,NetAssetValue, ROUND((((L.LatestNAV)-NetAssetValue)/NetAssetValue)*100,2) AS AbsoluteReturns FROM MF_NAVs JOIN (SELECT NetAssetValue AS LatestNAV FROM MF_NAVs WHERE SchemeCode=120503 ORDER BY DATE DESC LIMIT 1) AS L WHERE SchemeCode=120503 AND FIND_IN_SET( Date, ( SELECT CONCAT_WS( ',', Y.MaxDate, #LatestDate - MaxDate DATE_FORMAT(NOW() ,'%Y-01-01'), #YTD - Year To Datw MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 DAY THEN Date END), #1Day MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 7 DAY THEN Date END), #7Day MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 15 DAY THEN Date END), #15Day MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 MONTH THEN Date END), #1Month MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 3 MONTH THEN Date END), #3Month MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 6 MONTH THEN Date END), #6Month MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 1 YEAR THEN Date END), #1Year MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 3 YEAR THEN Date END), #3Year MAX(CASE WHEN `Date` <= Y.MaxDate - INTERVAL 5 YEAR THEN Date END), #5Year MIN(Date) #Inception ) FROM MF_NAVs JOIN (SELECT MAX(Date) AS MaxDate FROM MF_NAVs WHERE SchemeCode=120503) AS Y WHERE SchemeCode=120503 ) ) ORDER BY Date DESC ) r GROUP BY r.SchemeCode;