1

次のような2つのテーブルAとBがあります。アイテムごとにマージしたいのですが、返品日が注文日より後で、返品日がアイテムの対応する注文日に最も近い場所でのみです。結果の表は以下のCです。このマージを SQL コードで実現する方法を教えてください。

返品日は注文日と同じ年である必要はありませんが、返品日が注文日より後であることを考慮して、最も近い注文日に割り当てる必要があります。たとえば、アイテム 1 の場合、返品日 2009 年 9 月 15 日は、アイテム 1 の 3 つの注文日の中で 2009 年 8 月 14 日に最も近いため、2009 年 8 月 14 日が割り当てられます。品目 1 の返品日 2011 年 9 月 15 日は、品目 1 の 3 つの注文日すべての後ですが、2011 年 8 月 16 日に最も近いため、2011 年 8 月 16 日に割り当てられます。

どうもありがとう!

表 A:

Items    Order_Date
1        8/14/2009
1        8/15/2010
1        8/16/2011
2        9/10/2009
2        9/8/2010
2        9/12/2011

表 B:

Items    Return_Date
1        9/15/2009
1        9/15/2011
2        10/15/2010
2        11/15/2011

最終結果表 C:

Items        Order_Date    Return_Date
1            8/14/2009     9/15/2009
1            8/15/2010     NULL
1            8/16/2011     9/15/2011
2            9/10/2009     NULL
2            9/8/2010      10/15/2010
2            9/12/2011     11/15/2011
4

3 に答える 3

1

APPLYこちらも使用しました。サンプルデータと一致しているようです。

(回答終了時のサンプルデータ)

;with MatchedOrders as (
    select
        a.Items,a.Order_Date, b.Return_Date 
    from
        @TableB b
            cross apply
        (select top 1 * from @TableA a
             where a.Items = b.Items and a.Order_Date < b.Return_Date
             order by a.Order_Date desc) a
)
select
    a.Items,
    a.Order_Date,
    mo.Return_Date
from
    @TableA a
        left join
    MatchedOrders mo
        on
            a.Items = mo.Items and a.Order_Date = mo.Order_Date

結果:

Items       Order_Date                  Return_Date
----------- --------------------------- ---------------------------
1           2009-08-14 00:00:00.0000000 2009-09-15 00:00:00.0000000
1           2010-08-15 00:00:00.0000000 NULL
1           2011-08-16 00:00:00.0000000 2011-09-15 00:00:00.0000000
2           2009-09-10 00:00:00.0000000 NULL
2           2010-09-08 00:00:00.0000000 2010-10-15 00:00:00.0000000
2           2011-09-12 00:00:00.0000000 2011-11-15 00:00:00.0000000

サンプルデータ:

declare @TableA table (Items int not null,Order_Date datetime2 not null)
insert into @TableA(Items,Order_Date) values
(1,'20090814'),
(1,'20100815'),
(1,'20110816'),
(2,'20090910'),
(2,'20100908'),
(2,'20110912')

declare @TableB table (Items int not null,Return_Date datetime2 not null)
insert into @TableB(Items,Return_Date) values
(1,'20090915'),
(1,'20110915'),
(2,'20101015'),
(2,'20111115')
于 2012-08-24T07:48:24.553 に答える
0

これを試して:

select  ord.Items,ord.Order_Date,l.Return_Date  from orders ord
left join 
(
select * from (
select *,row_number() over (partition by return_date order by diff asc) as rn from (

select b.Items,b.Order_Date,a.Return_Date,a.diff  from 

(select o.Items,o.Order_Date,r.Return_Date,DATEDIFF(dd,o.Order_Date,r.Return_Date) diff  from orders o join ord_ret r
on o.Items = r.Items) a inner join 

(select a.Items,a.Order_Date,MIN(abs(a.diff)) as diff
from (
select o.Items,o.Order_Date,r.Return_Date,DATEDIFF(dd,o.Order_Date,r.Return_Date) diff  from orders o join ord_ret r
on o.Items = r.Items ) a
group by a.Items,a.Order_Date) b

on a.Items = b.Items and a.diff = b.diff  and a.Return_Date > b.Order_Date ) a) final
where rn<> 2) l

on ord.Items = l.Items and ord.Order_Date = l.Order_Date 
于 2012-08-24T07:47:23.697 に答える
0

OUTER APPLY が必要だと思います。次のようなことを試しましたか(SQLServer):

Select A.ItemID, A.OrderDate, [ReturnDates].ReturnDate
from Orders A
    OUTER APPLY (
        select Min(ReturnDate) as ReturnDate 
        From [Returns] b 
        where b.ReturnDate >= A.OrderDate AND b.ItemID = A.ItemID
        ) as ReturnDates
于 2012-08-23T22:44:21.810 に答える