2016-01-30 71 views
3

我有一個股票購買計劃,每個買入交易可能存在多個賣出交易。我正在嘗試創建一個查詢,以提取任何我仍然持有股票的股票。例如,如果我購買50只股票並且一天賣出20只,另一隻賣出20只,我應該還剩20股。我做了大部分辛苦工作,但我發誓我錯過了一些小事。如果它不存在於sell_transaction表中,我當前的查詢將不會提取結果。在我的例子中,這是buy_transactions中的transaction_id 3,它應該返回100份但不返回任何內容。下面的代碼可以放入SQL小提琴並繼續工作。左側加入總和和比較

架構

CREATE TABLE `buy_transactions` (
`buy_transactions_id` int(11), 
`buy_transaction_date` date, 
`symbol` varchar(50), 
`shares` int(11), 
`price_per_shae` decimal(10,6)); 

insert into buy_transactions values (1,'2016-01-25','A',15,100.000000); 
insert into buy_transactions values (2,'2014-03-16','A',20,30.000000); 
insert into buy_transactions values (3,'2016-01-15','AA',100,60.000000); 
insert into buy_transactions values (4,'2015-05-05','AA',500,60.000000); 

CREATE TABLE `sell_transactions` (
`sell_transactions_id` int(11) NOT NULL AUTO_INCREMENT, 
`sell_transaction_date` varchar(45) DEFAULT NULL, 
`shares` int(11) DEFAULT NULL, 
`price` decimal(10,6) DEFAULT NULL, 
`related_buy_transaction` int(11) DEFAULT NULL, 
PRIMARY KEY (`sell_transactions_id`)); 

insert into sell_transactions values (1, '2016-01-25', 5, 120.000000, 1); 
insert into sell_transactions values (2, '2016-01-25', 10, 130.000000, 1); 
insert into sell_transactions values (3, '2016-01-25', 10, 50.000000, 2); 
insert into sell_transactions values (4, '2016-01-15', 500, 61.000000, 4); 

當前查詢

select bt.buy_transactions_id, bt.symbol, bt.shares - rt.SoldShares as remaining_stock 
from buy_transactions bt 
left join 
    (select related_buy_transaction, sum(shares) as SoldShares from sell_transactions group by related_buy_transaction) rt 
on bt.buy_transactions_id = rt.related_buy_transaction 
where bt.shares - rt.SoldShares > 0; 

當前查詢結果

buy_transactions_id  symbol remaining_stock 
2      A  10 

SQLFiddle

+0

和所需/預期的結果? – Strawberry

回答

2

使用​​3210:

select bt.buy_transactions_id 
    , bt.symbol 
    , bt.shares - coalesce(rt.SoldShares, 0) as remaining_stock 
from buy_transactions bt 
left join 
(select related_buy_transaction 
     , sum(shares) as SoldShares 
    from sell_transactions 
    group by related_buy_transaction) rt on bt.buy_transactions_id = rt.related_buy_transaction 
where bt.shares > coalesce(rt.SoldShares, 0); 

SQLFiddle

+0

謝謝。另一方面的問題。這是我的第一個系統。你知道更好的方式來處理這種類型的交易嗎? –