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