SQL根据订单日期查找活动成本

SQL根据订单日期查找活动成本,sql,oracle,Sql,Oracle,我的公司使用标准成本计算法,我想知道在订购物品时找到与之相关的成本的最佳方法是什么?我使用SQL来提取数据,而不是将数据放入表中 例如,我有ABC项目的成本: Update Date Cost 12/26/2017 $40 2/1/2017 $43 12/27/2016 $39 Order Date Price 1/1/2018 $80 1/1/2017 $84 在另一个表中,我有AB

我的公司使用标准成本计算法,我想知道在订购物品时找到与之相关的成本的最佳方法是什么?我使用SQL来提取数据,而不是将数据放入表中

例如,我有ABC项目的成本:

 Update Date      Cost
 12/26/2017       $40
 2/1/2017         $43
 12/27/2016       $39
Order Date        Price
1/1/2018          $80
1/1/2017          $84
在另一个表中,我有ABC项目的订单:

 Update Date      Cost
 12/26/2017       $40
 2/1/2017         $43
 12/27/2016       $39
Order Date        Price
1/1/2018          $80
1/1/2017          $84
以下是数据应该如何汇集在一起,但我不确定如何:

Order Date        Price     Cost
1/1/2018          $80       $40
1/1/2017          $84       $39

谢谢你的建议

您可以使用相关子查询执行此操作:

select o.*,
       (select c.cost
        from costs c
        where c.updatedate <= o.orderdate
        order by c.updatedate desc
        fetch first 1 row only
       ) as cost
from orders o;
这使用ANSI标准语法。数据库将结果限制为一行的方式可能有所不同

编辑:

在Oracle的早期版本中,有多种方法可以实现这一点。这里有一种方法:

select o.*,
       (select max(c.cost) keep (dense_rank first order by c.updatedate desc)
        from costs c
        where c.updatedate <= o.orderdate
       ) as cost
from orders o;

可以使用相关子查询执行此操作:

select o.*,
       (select c.cost
        from costs c
        where c.updatedate <= o.orderdate
        order by c.updatedate desc
        fetch first 1 row only
       ) as cost
from orders o;
这使用ANSI标准语法。数据库将结果限制为一行的方式可能有所不同

编辑:

在Oracle的早期版本中,有多种方法可以实现这一点。这里有一种方法:

select o.*,
       (select max(c.cost) keep (dense_rank first order by c.updatedate desc)
        from costs c
        where c.updatedate <= o.orderdate
       ) as cost
from orders o;

在订单中添加成本列,在创建订单时插入订单成本。不要试图追溯计算。用您正在使用的数据库标记您的问题。在订单中添加成本列,在创建订单时插入订单成本。不要试图追溯计算这个问题。用你正在使用的数据库标记你的问题。谢谢你的回答。非常有用。如前所述,它在Order By语句之前抛出缺少右括号的错误。一些研究表明,它不喜欢order语句,因为它是为了选择一行而编写的。有什么想法吗?@ERKSMTY。Oracle支持仅从Oracle 12开始获取前1行。感谢您的回复。非常有用。如前所述,它在Order By语句之前抛出缺少右括号的错误。一些研究表明,它不喜欢order语句,因为它是为了选择一行而编写的。有什么想法吗?@ERKSMTY。Oracle支持仅从Oracle 12中开始获取前1行。