0

我有两张桌子

表一:(买入)

ID。名称、数量、成本

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

表 2:(卖出)

id、姓名、qt、已售出

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

我买东西然后转卖。

例如上面的表 1 显示:我买了 20 顶帽子,每顶 300 美元,60 只手表,每顶 800 美元,然后每顶 700 美元(这意味着每顶 716.66 美元)

然后我将它们作为上面的表 2 转售:18 顶帽子和 40 块手表。

所以我有 2 顶帽子和 10 块手表的库存

我想要向人们展示我的库存物品价值多少。

所以我还剩 2 顶帽子意味着 2 * 300 = 600 美元

我还剩 10 块手表意味着 20 * $716.66 = $1433.2

我总共有 $600 + $1433.2 = $14933.2

我怎样才能从上面的 2 个表中得到 (14933.2) 的结果。这对我来说真的很重要,所以请帮忙!

4

1 回答 1

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 。

顺便说一句,您在这里使用的是普通演员模型。如果您的所有产品都已售出,并且您以 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
于 2013-07-09T10:46:59.957 回答