bugfix> sql > 投稿

私の会社は標準原価計算を使用していますが、注文時にアイテムに関連付けられたコストを見つけるための最良の方法を考えていますか? SQLを使用してデータを抽出しています(データをテーブルに入れません)。

たとえば、アイテムABCには次のコストがあります。

Update Date      Cost
 12/26/2017       $40
 2/1/2017         $43
 12/27/2016       $39

別の表に、アイテムABCの注文があります:

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

ご提案ありがとうございます!

回答 2 件
  • 相関サブクエリを使用してこれを行うことができます。

    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標準構文を使用します。データベースは、結果を1行に制限する方法が異なる場合があります。

    編集:

    Oracleの以前のバージョンでは、これにアプローチする方法は複数あります。 1つの方法を次に示します。

    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;
    
    

  • with costs (UpdateDate,Cost) as (
    select to_date ('10/27/2017', 'mm/dd/yyyy'),60 from dual union all
    select to_date ('11/25/2017', 'mm/dd/yyyy'),50 from dual union all
    select to_date ('12/26/2017', 'mm/dd/yyyy'),40 from dual union all
    select to_date ('2/1/2017',   'mm/dd/yyyy'),43 from dual union all
    select to_date ('11/27/2016', 'mm/dd/yyyy'),39 from dual union all
    select to_date ('12/27/2016', 'mm/dd/yyyy'),35 from dual 
    )
    , orders (OrderDate,Price) as (
    select to_date('1/1/2018','mm/dd/yyyy'),80 from dual union all
    select to_date('1/1/2017','mm/dd/yyyy'),84 from dual
    )
    select orderdate, price, 
           max(updatedate) updt, 
           max(cost) keep(dense_rank first order by updatedate desc) cost
    from (
      select * from orders join costs on (orders.orderdate >= costs.updatedate)
    )
    group by orderdate, price;
    
    

あなたの答え