2013-07-09 131 views
0

我有兩個表SQL LEFT JOIN,SUM和GROUP BY和我stucked

表1:(買入)

ID。名,QT,成本

  1. 帽子,20,300
  2. 手錶,10,800
  3. 手錶,50,700

表2:(SELL)

ID,名稱,qt,出售

  1. 帽子,8,600
  2. 帽子,10,800
  3. 手錶,40,1300

我買東西,然後轉售。

例如上述表1顯示:我買20個帽子每個$ 300,以及60代表爲每個$ 800每然後$ 700(這意味着$ 716.66每個)

然後我reselled它們作爲表2以上:18個帽子和40手錶。

所以我有2個帽子,手錶10離開的inStock

我要的是向人們展示多少我的商品價值的inStock。

所以我有2個帽子離開裝置2 * 300 = $ 600

我有10個手錶左裝置20 * $ 716.66 = $ 1433.2

總我有$ 600±$ 1433.2 = $ 14933.2

如何可以我從上述2個表中得到(14933.2)的結果。 這對我來說非常重要,所以請大家幫忙!

+0

我會用第三個表什麼你希望做的。把它叫做STOCK或類似的東西,把所有的買賣數據都放在它裏面......當你買賣股票的時候,這些消息可以更新你的股票表格,然後你可以對這個表格做出反應。 –

回答

2

你可以這樣說:

select 
    b.name, 
    @av_cost := (select sum(x0.qt*x0.cost)/sum(x0.qt) from buy x0 where x0.name=b.name) as av_cost, 
    @nr_buy := (select sum(x1.qt) from buy x1 where x1.name=b.name) as nr_buy, 
    @nr_sold := (select sum(x2.qt) from sell x2 where x2.name=b.name) as nr_sold, 
    @in_stock := @nr_buy - @nr_sold as in_stock, 
    @in_stock * @av_cost as value_in_stock 
from buy b 
group by 1 

我敢肯定有人可以優化這一點,但現在它的工作原理。

查看Sql fiddle的工作示例。

B.T.W.你在這裏工作的平均演員模型。如果你所有的產品都被出售了,而你購買了一個新的產品,比如500美元,那麼這個數量不會超過這個數量,因爲過去你可能會有不同的價格。

如果這不是你想要的,你需要看一下「先進先出」系統。你最近的20塊手錶的價格是20 * 700,因爲你最近的50塊手錶每塊花費700塊。

編輯:只有總

如果你只想要總,你當然可以這樣做:

select sum(x.value_in_stock) as value_total 
from (
select 
    b.name, 
    @av_cost := (select sum(x0.qt*x0.cost)/sum(x0.qt) from buy x0 where x0.name=b.name) as av_cost, 
    @nr_buy := (select sum(x1.qt) from buy x1 where x1.name=b.name) as nr_buy, 
    @nr_sold := (select sum(x2.qt) from sell x2 where x2.name=b.name) as nr_sold, 
    @in_stock := @nr_buy - @nr_sold as in_stock, 
    @in_stock * @av_cost as value_in_stock 
from buy b 
group by 1 
) x 
+0

謝謝Rik!有用 –