2011-02-10 39 views
2

需要使用SQL查詢幫助,這可以從一個表協調多個條目(買/賣),以單行項,跟蹤買入和賣出的數量和數量左列量:我有一個表SQL Reconcillation查詢

如下:

CREATE TABLE [dbo].[Trades(
[Id] [bigint] IDENTITY(1,1) NOT NULL, 
[ExecId] [varchar](35) NULL, 
[Side] [varchar](6) NULL, 
[Symbol] [varchar](35) NULL, 
[LastQty] [varchar](35) NULL, 
[LastPrice] [varchar](25) NULL, 
[LeftQty] [varchar](35) NULL, 
[Date] [varchar](35) NULL 
) 

的條目:

Id Side Symbol Qty LastPrice LeftQty Date 
1  Buy ABC 100  10.00  0  1/1/2011 
2  Sell ABC 100  12.00  0  1/1/2011 
3  Sell XYZ 200  8.00  0  1/1/2011 
4  Buy XYZ 100  7.00  100  1/1/2011 

我如何可以查詢表,以從以前的數據reconcillation報告如下:

Id Side Symbol EntQty EntPrice EntQty EntLeft ExtSide ExtQty ExtPrice ExtLeft 
    1 Buy ABC  100  10.00 100  0  Sell 100  12.00  0 
    2 Sell XYZ  200  8.00 200  0  Buy  100  7.00 100 

我需要相反的買入/賣出條目合併到同一行,然後跟蹤量(數量)剩餘,如果購買數量不等於銷售數量

回答

2

我認爲你可以有1銷售條目和1購買條目,並始終都是。如果您只能擁有其中一個,則需要使用左連接或右連接,具體取決於哪一個總是存在。

由於您有多個標識,因此無法返回標識,因此您沒有任何標準可以選擇其中的一個。

編輯:我們得到每個符號:

  • 對於boughts:總量,平均價格和左數量
  • 對於售價:總量,平均價格和左數量
  • 遺骸數量(boughts總剩餘數量 - 銷售總剩餘數量)

如果你想爲每個不同的配對買入,你需要一些東西來加入這對配對(一些共同的領域)。由於你還沒有任何領域加入他們,我認爲這是不可能的。

您可以像查詢一樣獲取單個行上每個符號的所有信息。

SELECT s.Symbol as Symbol, 
     b.SQty as EntQty, b.APrice as EntPrice, b.SLeft as EntLeft, 
     s.SQty as ExtQty, s.APrice as ExtPrice, s.SLeft as ExtLeft, 
     b.Qty - s.Qty as Remain     
    FROM 
     (SELECT Symbol, 
       sum(Qty) as SQty, avg(Price) as APrice, sum(LeftQty) as SLeft 
     FROM Trades WHERE Side = 'Sell' GROUP BY Symbol) s 
     INNER JOIN 
     (SELECT Symbol, 
       sum(Qty) as SQty, avg(Price) as APrice, sum(LeftQty) as SLeft 
     FROM Trades WHERE Side = 'Buy' GROUP BY Symbol) b 
     ON s.Symbol = b.Symbol 
+0

borja,當你說'只有他們中的一個'時......實際上會有數百個,但他們應該有一個匹配(即1買1賣)是你的意思? – CraigJSte 2011-02-10 11:34:20

+0

如果對於給定的符號,您只有1買1賣,此查詢適用。如果不是您的情況,則查詢需要更改 – Borja 2011-02-10 11:43:11

0

最簡單的是:

    由符號和側
  • 組數據,
  • 做一個自我加入的結果,對結果

例如設置:

WITH DATA AS 
(
    SELECT Symbol, Side, Sum(EntPrice), Sum(EntLength) 
    FROM Trades 
    GROUP BY Symbol, Side 
) 
SELECT Symbol, -- Calculation goes here 
    FROM DATA Sell 
    JOIN DATA Buy ON Sell.Symbol = Buy.Symbol 
WHERE Sell.Side = SELL AND Buy.Side = BUY 

如果沒有爲每個符號設置買賣線,進行交叉連接並在計算中正確處理空位