【问题标题】:calculating Product Cost Price in runtime在运行时计算产品成本价格
【发布时间】:2013-10-15 11:39:01
【问题描述】:

我正在开发一个库存系统,使用平均成本法,其中产品的平均成本价格在每次新购买时都会发生变化。我使用的数据库是 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。

我正在寻找这样的查询来完成这项工作???

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

有什么建议吗????

问候拉扎

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

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

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

    [上传问题]

    相关子查询是 . . .

    select s.*,
    

            (选择前 1 个 ave_cost_price 从购买 p 其中 p.purchase_date

    如果您在purchase(product_id, purchase_date) 甚至purchase(product_id, purchase_date, ave_cost_price) 上有索引,则性能应该很好。

    【讨论】:

    • 感谢您的回复,请再次查看问题,因为我已经编辑了另一件事,您能否解释一下为什么您不喜欢相关子查询,是否存在性能问题,因为我将对大约 1500 种产品运行此查询,每种产品每天的销售额超过 100 次
    • @user1115284 。 . .我编辑了解决方案,但仍然无法格式化 SQL 代码。至少现在一切都在那里。
    • 谢谢,我想,如果没有找到购买产品的情况,需要其他查询才能从产品表中获取开盘成本价:)
    • @user1115284 。 . .是的,如果这是处理这种情况的业务规则。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 2011-03-10
        • 2021-07-10
        • 1970-01-01
        • 2013-08-13
        相关资源
        最近更新 更多