2016-02-13 63 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.买方的安全数量需要与卖方的安全数量相匹配,如果有意义的话。 –