2011-01-09

『股票交易紀錄』:持股明細數量要如何計算?

OSS首頁》《文章分類列表》《Base》《Calc》《Draw》《Impress》《Writer

閱讀本文前,請先確認,您已看過、知道以下幾篇的內容:

基本上,持股數量的計算,是透過以下的思考方式來進行的:
個別證券帳號的單一股票持股數量=個別證券帳號的單一股票買進數量加總 - 個別證券帳號的單一股票賣出數量加總

基於以上的公式,運用資料庫View的方式,彙整『個別證券帳號的單一股票買進數量明細』,這個View命名為:
V_買進數量明細
SELECT ( "證券帳號" + "股票代號名稱" + "買進項次" ) AS "BKey", "證券帳號", "股票代號名稱", "買進項次", "買進股數" AS "BQty"
FROM "股票買進紀錄"

接著,彙整『個別證券帳號的單一股票賣出數量明細』,這個View命名為:
V_賣出數量明細
SELECT ( "證券帳號" + "股票代號名稱" + "買進項次" ) AS "SKey", "證券帳號", "股票代號名稱", MAX( "買進項次" ) AS "BNo", MAX( "賣出項次" ) AS "SNo", SUM( "賣出股數" ) AS "SQty"
FROM "股票賣出紀錄"
GROUP BY "SKey"
因為一次買進,可能會分多次賣出,所以加總一下賣出的數量,買進項次,是連結『股票買進紀錄』『股票賣出紀錄』這兩個資料表格的資料欄位之一,同一筆買進再賣出時,賣出股數要加總,買進項次、賣出項次的資料欄位是自動編號的整數,不需要加總,所以取MAX來代替。

接著,要彙總買進、賣出,來計算持股的明細,這個View命名為:
V_買賣數量計算
SELECT "V_買進數量明細"."證券帳號", "V_買進數量明細"."股票代號名稱", IFNULL( SUM( "V_買進數量明細"."BQty" ), 0 ) AS "BQty1", SUM( "V_賣出數量明細"."SQty" ) AS "SQty1", ( SUM( "V_買進數量明細"."BQty" ) - IFNULL( SUM( "V_賣出數量明細"."SQty" ), 0 ) ) AS "Qty1"
FROM "V_買進數量明細"
LEFT JOIN "V_賣出數量明細" ON "V_買進數量明細"."BKey" = "V_賣出數量明細"."SKey"
GROUP BY "V_買進數量明細"."證券帳號", "V_買進數量明細"."股票代號名稱"
這個V_買賣數量計算,需要說明的地方有:
  1. 有買進,未必有賣出,所以要用LEFT JOIN來產生已買進但未賣出,賣出數量應該為0的賣出資料。
  2. 有買進,未賣出,雖可透過LEFT JOIN來產生賣出資料,但產生的賣出股數為NULL,數字跟NULL無法正確計算,所以透過IFNULL函數,來將NULL值轉為0,這樣才可以正確計算。
銀行可用現金餘額的計算方式,跟持股數量的計算是一樣的道理,讀者可以試著自己解析一下,相信會有收穫的!

2 則留言:

匿名 提到...

V_買進數量明細
[SELECT ( "證券帳號" + "股票代號名稱" + "買進項次" ) AS "BKey]...

是用 SQL 命令行一個字一個字輸入的呢 ?

還是用 "檢視表格" 完成的? 如果是用 "檢視表格" 做的,那麼 ["證券帳號" + "股票代號名稱" + "買進項次"] 這個欄位要怎麼完成呢 ?

JACKLIN183

Hannibal 提到...

1. 先在表格內用『建立檢視(K)』,建立一個命名為『V_買進數量明細』的View,隨便拉個表格、拉一兩個資料欄位。
2. 選擇『V_買進數量明細』,以滑鼠右鍵開啟功能選項,點選『以SQL檢視編輯(E)』,Coding出想要的內容。

謝謝您!(有跟著做,才會發現問題...)