Php 根据平均购买率和销售率计算营业利润

Php 根据平均购买率和销售率计算营业利润,php,mysql,Php,Mysql,我试图计算我的利润,产品库存量和价值从购买和销售。 假设我的购买表为 我的销售表是 目前,我已经成功地使用php完成了这项工作。但由于我有超过10万的买卖,它的运作非常缓慢。所以我需要一个mysql解决方案。下表介绍了我的利润/库存计算方法 合并购买和销售,然后按日期排序 平衡库存价值只取决于平均购买率,而不是销售率 利润=(售出率-平均购买率)*售出数量 所以我需要在2017年11月23日的报告中 利润=602.38 库存量=110 股票价值=9052.3806 哪一种是获得上述结果

我试图计算我的利润,产品库存量和价值从购买和销售。 假设我的购买表为

我的销售表是

目前,我已经成功地使用php完成了这项工作。但由于我有超过10万的买卖,它的运作非常缓慢。所以我需要一个mysql解决方案。下表介绍了我的利润/库存计算方法

  • 合并购买和销售,然后按日期排序
  • 平衡库存价值只取决于平均购买率,而不是销售率
  • 利润=(售出率-平均购买率)*售出数量
  • 所以我需要在2017年11月23日的报告中

    • 利润=602.38
    • 库存量=110
    • 股票价值=9052.3806

    哪一种是获得上述结果的快速工作方法,是简单的select查询还是使用存储过程/函数?如果它是一个简单的查询,那么它应该是怎样的呢?

    到那时,您已经对每个
    产品id
    的期望结果发表了评论,我几乎完成了在给定时间范围内显示
    净利润
    库存数量
    库存价值
    的解决方案

    因此,无论如何,我在这里分享我的方法,因为它可能对你或其他试图解决这个问题的人有所帮助

    解决方案:

    select
           final.profit,
           final.Balance_Stock_Quantity,
           final.Balance_Stock_Value
    from
    (
    select tmp.date_,
           tmp.`Sale/Purchase`,
           tmp.product_id,
           tmp.quantity,
           tmp.rate,
           tmp.val,          
    (
      case when tmp.`Sale/Purchase` = 'purchase' 
                then (@total_quant := @total_quant + tmp.quantity)
           else      (@total_quant := @total_quant - tmp.quantity)
      end
    ) as Balance_Stock_Quantity,
    (
      case when tmp.`Sale/Purchase` = 'purchase' 
                then (@total_val := @total_val + tmp.val)
           else      (@total_val := @total_val - (@total_rate*tmp.quantity))
      end
    ) as Balance_Stock_Value,
    (
      case when tmp.`Sale/Purchase` = 'purchase' 
                then (@total_rate := @total_val/@total_quant) 
           else @total_rate
      end
    ) as Balance_Stock_Rate,
    (
      case when tmp.`Sale/Purchase` = 'sale' 
                then (@profit := (tmp.rate - @total_rate)*tmp.quantity) 
           else @profit
      end
    ) as profit
    
    from
    (
    (select p_date as date_,
           'Purchase' as `Sale/Purchase`,
           p_product_id as product_id,
           p_quantity as quantity,
           p_rate as rate,
           (p_quantity * p_rate) as val
    from purchase
    where p_date BETWEEN '2017-11-23 00:00:00' AND '2017-11-23 05:00:00'
    )
    union all
    (select s_date as date_,
           'Sale' as `Sale/Purchase`,
           s_product_id as product_id,
           s_quantity as quantity,
           s_rate as rate,
           (s_quantity * s_rate) as val
    from sales
    where s_date BETWEEN '2017-11-23 00:00:00' AND '2017-11-23 05:00:00' 
    )
    )tmp
    cross join
    (select 
            @total_quant := 0,
            @total_val := 0,
            @total_rate := 0, 
            @profit := 0) r
    order by tmp.date_
    )final
    order by final.date_ desc
    limit 1
    ;
    

    注1:我发现这是一个具有挑战性的问题,于是非常兴奋地开始解决这个问题,但最后我觉得我基本上在做一些与某些编程语言相同的事情(例如,
    case…when
    和使用变量维护
    利润
    数量
    等的以前的值之类的任务

    所以我真的不确定,这将如何比你目前的方法更有效,但我想它仍然值得一试

    注2:如果您的目标是显示每个产品的利润、股票和价值,我认为您应该坚持当前的方法

    尽管如此,如果您存储
    总量
    费率
    总值
    (如您问题中的第二幅图所示),您的任务会变得简单对于
    购买
    销售
    表中的每种产品本身。计算并存储这些值,同时在这些表中插入其他值(如果您负担得起的话)。这将在为最终报告编写查询时节省大量时间和精力


    希望有帮助!

    因此,在最后,您希望显示每种产品的每日报告。我说的对吗?上表中我只使用了一种产品,以便您轻松了解我的需要。但在我的实际案例中,将有数千种产品。因此,当我获得每种产品的总利润、数量和价值时,应按产品id对结果进行分组在两个给定日期之间。例如,2017-01-01到2017-03-31之间的报告。我已在中添加了我的数据库。我想你之前评论过,你想要的是净利润,而不是每个产品的利润。我正在研究你的查询。但当我尝试你的查询时,我得到了利润=613.1578947368421,余额库存数量=100,余额库存价值=8063。1578947368425,它与我在示例表中显示的不一样。它也只是一个产品。我需要以数组形式在产品方面获得结果(0=>[product_id=1],[quantity=100],[value=1000][profit=600],1=>[product_id=2],[quantity=50],[value=750][profit=320])我已经修改了链接和查询。请再次使用
    DEMO
    标题浏览我的答案中给出的链接。它将与您的输出相匹配。我在回答中已经说明,此查询返回的是净值,而不是每个产品的值。尽管如此,我在回答中添加了一些要点作为
    Notes
    ,可以帮助您完成你的任务。成功,回答得很好!!。我读了你的建议,并喜欢你的建议。但我需要通过查询获得每个产品的相同信息。不行吗?如果你能够创建和维护一个存储stock register中给定值的表(你问题中的第二个图像),那么我想,只需一个SQL查询就可以轻松完成。