当前位置: 首页 > 面试题库 >

根据先进先出的定价来计算利润

祁绪
2023-03-14
问题内容

假设我有一些SKU的购买和销售数据

po_id | sku | purchase_date    | price | qty
----------------------------------------------
    1 | 123 | 2013-01-01 12:25 | 20.15 |   5
    2 | 123 | 2013-05-01 15:45 | 17.50 |   3
    3 | 123 | 2013-05-02 12:00 | 15.00 |   1
    4 | 456 | 2013-06-10 16:00 | 60.00 |   7

sale_id | sku | sale_date        | price | qty
------------------------------------------------
      1 | 123 | 2013-01-15 11:00 | 30.00 |   1
      2 | 123 | 2013-01-20 14:00 | 28.00 |   3
      3 | 123 | 2013-05-10 15:00 | 25.00 |   2
      4 | 456 | 2013-06-11 12:00 | 80.00 |   1

假设按购买顺序出售,我如何通过SQL查找销售利润率?例如,sku 123的保证金是

30*1 + 28*3 + 25*2 - 20.15*5 - 17.50*1

其中有2件以17.50购买,还有1件以15.00购买尚未售出。


问题答案:

好问题。我采用的方法是计算总销售额。然后计算累计购买量,并将其与特殊逻辑结合起来以得出正确的结合算术:

select s.sku,
       (MarginPos - SUM(case when s.totalqty < p.cumeqty - p.qty then p.price * p.qty
                             when s.totalqty between p.cumeqty - p.qty and p.qty
                             then s.price * (s.totalqty - (p.cumeqty - p.qty))
                             else 0
                        end)
       ) as Margin
from (select s.sku, SUM(price*qty) as MarginPos, SUM(qty) as totalqty
      from sales s
     ) s left outer join
     (select p.*,
             (select SUM(p.qty) from purchase p2 where p2.sku = p.sku and p2.sale_id <= p.sale_id
             ) as cumeqty
      from purchase s
     )
     on s.sku = p.sku
group by s.sku, MarginPos

注意:我尚未测试此查询,因此它可能存在语法错误。



 类似资料:
  • 介绍 FIFO(first in first out) 先进先出策略。元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存(链表首部对象)。 优点:简单快速 缺点:不灵活,不能保证最常用的对象总是被保留 使用 Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3); //加入元素,每个元素可以设

  • 我现在有一张表,示例如下, 其中总数列是每个产品要出库的数量, ShipmentID是出库的批次,每个产品可能有很多个批次(虽然示例表只给了一个) 每个产品都对应了很多订单,预计到货时间列是订单号对应的到货时间, 待到货量即订单的数量, 现在需要把每个订单中的待到货量按先进先出即预计到货时间在前的先出,分配给不同批次的出库量。 得到的结果如下图所示。 我根据网上搜到的提示,写了半天,写出几行代码,

  • 问题内容: 这是我的门禁桌[dbo]。[tblAccess] 情况 假设员工将在同一天进出。 员工当天将有多个进出,因此需要先进后出。 需要每天获取详细信息,两个日期之间,按EmployeeId分组 员工的(InTime,InLocation)或(OUTTime,OutLocation)可以为null 如果(InTime)为null,则FirstInLocation和duration将为null,

  • 问题内容: 请问您在以下方面的帮助吗? 我正在尝试计算结果中从一条记录到下一条记录的变化。如果我向您显示我当前的查询和结果,可能会有所帮助… 查询给我这些结果… 理想情况下,我想要获得的结果将类似于以下内容… 查看“ 2012年1月1日”的行,由于“笔数”已从以前的526增加到531,因此“ TChange”的值为5。“ FChange”将基于“ Funded”字段。我猜想要知道的是,此示例的上一

  • 王军霞跑得快,能得奥运会冠军,人家跑步是有技术的。动不动就一万几千米地跑你就要学会前紧后松,要是一上来就百米冲刺般跑出去,前面倒是能领先好一阵,可好景不长,最后不要说拿第一名,连名次都没有就可惜了,毕竟你还为了这事还花去了好大体力。 但牛人也例外,记得绝影还是年大学的时候,有一次体育考一千米跑,几个人跑下来累得像猪一样,却发现旁边有个不认识的猛男一直保持着冲刺的速度。一干女生无不羡慕地说:“你看人

  • 我正在寻找一个整洁的解决以下问题。 我有以下示例数据集: 我需要根据列2和列1中的前一个值填写NAs。如果我从第一个NA(第1列,第2行)开始,并且第2列大于1,那么我将把第1列的值(第1行)乘以第2列的值。那么如果col2小于等于1,那么col1正好等于前面的值。 这应该是最终结果: 我尝试了但没有得到想要的结果: 显然,我没有捕获我想要使用前一行的值的部分。任何帮助都将不胜感激。