在运行时计算产品成本价格

时间:2013-02-05 21:02:05

标签: sql sql-server-2008

我正在使用平均成本法开发库存系统,其中每次新购买时产品的平均成本价格都会发生变化。我使用的数据库是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报告时,SALE-1应该是5.5,SALE-2,6.5和SALE-3应该选择7.5作为产品成本价格。如果它找不到任何购买,那么它应该从product_table中选择打开Cost_Price。

我正在寻找这样一个应该完成工作的查询???

我认为可能可以通过某些分组和内部联接来完成,但无法弄明白。

任何建议请????

尊重Raza

3 个答案:

答案 0 :(得分:0)

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

但这是一个我认为这是最佳方法的案例:

[麻烦上传]

相关子查询是。 。

select s.*,

(选择前1名ave_cost_price             来自购买p 其中p.purchase_date< = sys.sale_date和p.product_id = s.product_id p.purchase_date desc )购买价格     来自销售部门

如果您有purchase(product_id, purchase_date)甚至purchase(product_id, purchase_date, ave_cost_price)的索引,那么效果应该没问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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