2013年9月18日 星期三

若無基金淨值時,則以前一營業日淨值替代

本範例將以富達東南亞(境外基金)及景順台灣精選基金(國內基金)為例,一般國內基金於當日即可結算並公告基金現值,境外基金通常稍晚一日或數日,查詢當日若該檔基金尚無基金報價資料時,則以前一營業日淨值替代。原始資料及希望結果如下:
#
圖示
說明
原始資料

ü  富達東南亞為境外基金,最新報價日期為2013-09-16,淨值為6.868
ü  景順台灣精選為台股基金,最新報價資料為2013-09-17,淨值為23.93
ü  二檔基金各3筆,合計6資料。


希望結果

希望呈現結果如右圖。

富達東南亞基金尚無2013-09-17之淨值資料,將以前一營業日2013-09-16之淨值替代,將增加1筆資料,合計7筆。

如何填補最新淨值資料之作法,主要想法是擷取各檔基金最新報價,並據以產生查詢報價日之基金淨值,即日期固定以查詢報價日期替換;再以UNION方式與原資料結合,利用UNION運算上將剔除重覆部分之特性,即可進行必要之填補,也可避免資料重覆出現,當然也可使用DISTINCTSQL及結果如下:
SQL
#
SQL/結果
說明
SQL
WITH Store AS
(
--兩檔基金資料(6)
SELECT FUND_ID
  , NAV_DATE
  , NAV
  , ROW_NUMBER() OVER(PARTITION BY FUND_ID
           ORDER BY NAV_DATE DESC) SEQ --重點1
FROM FUND
WHERE 1=1
)
--(1).以兩檔基金個別的最後1筆資料(2),產生查詢日期基金資料
------------------------------------(1)
SELECT FUND_ID
, '2013-09-17' NAV_DATE --測試時, 使用固定時間 --重點2
--, TO_CHAR(SYSDATE, 'YYYY-MM-DD') NAV_DATE --重點2
  , NAV
  --, 0 SEQ
FROM Store
WHERE 1=1
  AND SEQ = 1 --重點2
------------------------------------(1)
UNION         --重點3
--(2).兩檔基金資料(6)
------------------------------------(2)
SELECT FUND_ID
, NAV_DATE
, NAV
  --, SEQ
FROM Store
ORDER BY FUND_ID, NAV_DATE DESC
------------------------------------(2)
重點1:ROW_NUMBER產生各基金之序號,依日期反向編號。序號為1者,代表該檔基金最新淨值。

重點2:以各基金最新報價產生查詢報價日之基金淨值。

重點3:UNION結合產生之最新報價及原始資料,填補缺漏之基金報價。
結果

ü  富達東南亞12013-09-17之淨值,資料與前一日前同,由3筆變為4筆。

ü  景順台灣精選已有2013-09-17資料,因此不變。


資料產生(ORALCE為例,MSSQL改以INTO #Fund)
CREATE TABLE FUND
AS
SELECT '景順台灣' FUND_ID
, DATE'2013-09-17' NAV_DATE
, 23.93 NAV
FROM DUAL
UNION ALL
SELECT '景順台灣', DATE'2013-09-16', 23.95
FROM DUAL
UNION ALL
SELECT '景順台灣', DATE'2013-09-14', 23.78
FROM DUAL
UNION ALL
SELECT '富達東南亞', DATE'2013-09-16', 6.868
FROM DUAL
UNION ALL
SELECT '富達東南亞', DATE'2013-09-13', 6.763
FROM DUAL
UNION ALL
SELECT '富達東南亞', DATE'2013-09-12', 6.777

FROM DUAL

沒有留言:

張貼留言