2016-02-13 62 views
1

我有一個看起來像這樣的數據:FIFO比賽的第一隻股票買先賣SQL

Stock buys and sells

我需要一個查詢到FIFO方法適用於買入和賣出,所以我得到一個表,看起來像這樣:

我希望能夠匹配第一個買入/賣出的第一個賣出左邊的買入和賣出的權利。如果沒有賣出,則應在右側應用空值,如果沒有買入,則應在左側應用空值。經紀交易密鑰可以用作交易發生的順序。這是我到目前爲止嘗試過的。任何幫助將非常感激!

SELECT a.ACCT_ID, a.Trade_Date_Key, a.Brokerage_Transaction_Key, a.Buy_Sell_Code, a.Principal_Amt, a.Security_Quantity 
    , (a.Security_Quantity + b.Security_Quantity) CUMULATIVE_POSITION 
    , a.SHARE_PRICE 
    , (A.Principal_Amt + B.Principal_Amt) CUMULATIVE_VALUE 
from #TRANSACTIONS_WITH_RANK a 
    left join #TRANSACTIONS_WITH_RANK b 
    on a.acct_id = b.acct_id and a.rank = b.rank + 1 
ORDER BY BROKERAGE_TRANSACTION_KEY 

回答

0

在你的問題中,你提到將第一次買入與第一次賣出相匹配,但是你的示例輸出似乎忽略了該部分。下面是如果你想先買(縣)先賣(S)匹配基礎上,Acct_IDTrade_Date

SELECT buy.*, sell.* 
FROM #TRANSACTIONS_WITH_RANK buy 
    INNER JOIN (
     SELECT MIN(Trade_Date) Trade_Date 
     FROM #TRANSACTIONS_WITH_RANK 
     WHERE Buy_Sell_Code = 'B' 
     GROUP BY Acct_ID 
    ) TDateBuy 
    ON buy.Trade_Date = TDateBuy.Trade_Date 
    FULL OUTER JOIN #TRANSACTIONS_WITH_RANK sell 
     INNER JOIN (
      SELECT MIN(Trade_Date) Trade_Date 
      FROM #TRANSACTIONS_WITH_RANK 
      WHERE Buy_Sell_Code = 'S' 
      GROUP BY Acct_ID 
     ) TDateSell 
     ON sell.Trade_Date = TDateSell.Trade_Date 
    ON buy.Acct_ID = sell.Acct_ID 

編輯如何做一個例子:看到OP的評論我有後改變了查詢

SELECT 
    buy.Acct_ID, buy.Trade_Date, buy.Brokerage_Transaction_Key, buy.Buy_Sell_Code, buy.Principal_Amt, buy.Security_Quantity, 
    sell.Acct_ID, sell.Trade_Date, sell.Brokerage_Transaction_Key, sell.Buy_Sell_Code, sell.Principal_Amt, sell.Security_Quantity 
FROM (
     SELECT wr.*, MIN(TransKey) TransKey -- This is the value of the Sell to be joined 
     FROM #TRANSACTIONS_WITH_RANK wr 
      LEFT OUTER JOIN (
       SELECT MIN(Brokerage_Transaction_Key) TransKey, Acct_ID 
       FROM (
         SELECT 
          tr.*, 
          (
           SELECT MAX(Brokerage_Transaction_Key) --Purpose is to give outer query value to GROUP on 
           FROM #TRANSACTIONS_WITH_RANK 
           WHERE Buy_Sell_Code = 'B' 
            AND Acct_ID = tr.Acct_ID 
            AND Brokerage_Transaction_Key < tr.Brokerage_Transaction_Key 
          ) MaxLesserKey 
         FROM #TRANSACTIONS_WITH_RANK tr 
        ) data 
       WHERE Buy_Sell_Code = 'S' 
       GROUP BY Acct_ID, MaxLesserKey 
      ) MinSell 
      ON wr.Acct_ID = MinSell.Acct_ID 
       AND wr.Brokerage_Transaction_Key < MinSell.TransKey 
     WHERE Buy_Sell_Code = 'B' 
     GROUP BY wr.Acct_ID, Trade_Date, Brokerage_Transaction_Key, Buy_Sell_Code, Principal_Amt, Security_Quantity 
    ) buy 
    FULL OUTER JOIN (
     SELECT wr.*, MIN(MinBuy.TransKey) TransKey -- This is the value of the Buy to be joined 
     FROM #TRANSACTIONS_WITH_RANK wr 
      LEFT OUTER JOIN (
       SELECT MIN(Brokerage_Transaction_Key) TransKey, Acct_ID 
       FROM (
         SELECT 
          tr.*, 
          (
           SELECT MAX(Brokerage_Transaction_Key) --Purpose is to give outer query a value to GROUP on 
           FROM #TRANSACTIONS_WITH_RANK 
           WHERE Buy_Sell_Code = 'S' 
            AND Brokerage_Transaction_Key < tr.Brokerage_Transaction_Key 
          ) MaxLesserKey 
         FROM #TRANSACTIONS_WITH_RANK tr 
        ) data 
       WHERE Buy_Sell_Code = 'B' 
       GROUP BY Acct_ID, MaxLesserKey 
      ) MinBuy 
      ON wr.Acct_ID = MinBuy.Acct_ID 
       AND wr.Brokerage_Transaction_Key < MinBuy.TransKey 
     WHERE Buy_Sell_Code = 'S' 
     GROUP BY wr.Acct_ID, Trade_Date, Brokerage_Transaction_Key, Buy_Sell_Code, Principal_Amt, Security_Quantity 
    ) sell 
    ON buy.TransKey = sell.Brokerage_Transaction_Key 
     OR sell.TransKey = buy.Brokerage_Transaction_Key 

基本上,這樣做是抓住所有購買(S)及其配套供應Brokerage_Transaction_KeyTransKey),並做了FULL OUTER JOINNULL小號OU當沒有相反的匹配交易時,買入或賣出方)與賣出套及其匹配買入Brokerage_Transaction_KeyTransKey)。 TransKey是針對每組買入/賣出的相反Buy_Sell_Code中最小的Brokerage_Transaction_Key。這將首先出售給第一次購買或第一次購買,以首先出售特定Acct_ID的每組交易。 MaxLesserKey字段只是爲了給TransKey查詢的值GROUP

+0

對不起,我應該更清楚,brokerage_transaction_key是一個唯一的字段,指示交易的順序。所以它需要用於指示哪個買入在哪個賣出在每個帳戶之前。 –

+0

我現在明白了。這僅僅是爲了第一個買/賣組合嗎?即一個賬戶有三個與單個賣出(稱爲'set1')匹配的買入,然後在他們有一個賣出(稱爲'set2')之前他們有另外兩個買入。 'set2'應該顯示爲數據中的另一組買/賣,還是應該只顯示'set1'? – Kidiskidvogingogin

+0

你是對的應該設置2.買方的安全數量需要與賣方的安全數量相匹配,如果有意義的話。 –