0

我正在开发一个库存系统,使用平均成本法,产品的平均成本价格在每次新购买时都会发生变化。我使用的数据库是 SQL Server 2008

现在我需要在报告中计算已售商品的成本,我必须为每个产品的销售添加成本价,但这个成本价应该与特定的采购期相关。

我的采购表

Purchase_Date   Product_ID   Ave_Cost_Price
1-jan-2013      1                  5.5
15-jan-2013     1                  6.5
30-jan-2013     1                  7.5

我的销售表

Sale_Date   Product_ID    Sale_Price Cost_Price
5-jan-2013      1              10         ?         SALE-1
17-jan-2013     1              10         ?         SALE-1
31-jan-2013     1              15         ?         SALE-1

现在,当我创建销售报告时,SALE-1 应该采用 5.5,SALE-2、6.5 和 SALE-3 应该选择 7.5 作为产品成本价。如果它找不到任何购买,那么它应该从 product_table 中选择打开 Cost_Price。

我正在寻找应该完成这项工作的此类查询???

我认为可能可以通过一些分组和内部连接来完成,但无法弄清楚。

请问有什么建议吗???

问候拉扎

4

3 回答 3

0

我不是该select子句中相关子查询的忠实拥护者。部分原因是美观和可维护性。我更喜欢将所有表引用放在一个地方,在from子句中。部分原因是性能;我倾向于认为它们变成了嵌套循环连接(通常更糟)。不可否认,SQL 优化器在过去几年中变得更好。

但这是我认为最好的方法之一:

[上传问题]

相关子查询是 。. .

select s.*,

           (select top 1 ave_cost_price from purchase p where p.purchase_date <= sys.sale_date and p.product_id = s.product_id order by p.purchase_date desc) a purchaseprice from sales s

purchase(product_id, purchase_date)如果你有一个索引 on or even ,性能应该没问题purchase(product_id, purchase_date, ave_cost_price)

于 2013-02-05T21:05:51.567 回答
0

加入产品 id 和日期的两个表 - 仅月和年部分,按 id+月/年排序。减去...对不起,没有查询,因为您没有发布任何数据。

于 2013-02-05T21:29:12.193 回答
0

对此类数据进行报告的一种常见方法是创建一个非规范化的数据仓库表。在其中,您将有销售列和任何计算的附加列,例如成本。使用基于销售额的插入填充第一列,然后使用选择适当成本的第二个插入查询填充其余列。然后,您的报告将针对此数据仓库表运行。

这里在速度和简单性方面的优势是显而易见的,尤其是在您拥有大量记录的情况下。您还将非常轻松地针对这个“平面”表编写报告。唯一的缺点是对原始数据的任何更改都需要重新应用于仓库表。但是,通常情况下,您会在某个“关闭”期之前填充仓库表,在此之后,记录将不再更改。至于如何选择正确的成本,大多数地方会使用给定时期内商品的平均美元成本,而不是尝试将某些特定的购买“批次”与销售相匹配。否则,在您描述的方法中,几乎不可能处理退货之类的事情。您为退回的产品分配了多少成本?我想如果这些物品足够大,可以有序列号或其他唯一标识符,那么你可以这样做。但是,在这种情况下,您的成本选择查询将与日期无关。这将与ID相关。

于 2013-10-15T03:39:01.753 回答