2009-09-01 12 views
0

私は面倒なSQLの問題を抱えています。ここSQLのヘルプ - 2行を1行にまとめる

は、サンプルデータセットである:

Warehouse DateStamp TimeStamp ItemNumber ID 
    A  8/1/2009 10001   abc  1 
    B  8/1/2009 10002   abc  1 
    A  8/3/2009 12144   qrs  5 
    C  8/3/2009 12143   qrs  5 
    D  8/5/2009 6754   xyz  6 
    B  8/5/2009 6755   xyz  6 

このデータセットは、2つの倉庫間の在庫転送を表します。各転送を表す2つのレコードがあり、これらの2つの転送レコードは常に同じItemNumber、DateStamp、およびIDを持ちます。 2つの転送レコードのTimeStamp値には常に1の差があります。小さいTimeStampはソースウェアハウスレコードを表し、大きなTimeStampは宛先ウェアハウスレコードを表します。私は望ましい結果セットを生成するコードを書くことができます

Warehouse_Source Warehouse_Destination ItemNumber DateStamp 
    A    B      abc  8/1/2009 
    C    A      qrs  8/3/2009 
    D    B      xyz  8/5/2009 

が、このレコードの組み合わせがSQLを介して可能であった場合、私は思っていた:上記のサンプルデータセットを使用して

は、ここで私は必要なクエリの結果セットがあります。私は基礎データベースとしてSQL Server 2005を使用しています。また、WHERE句をSQLに追加する必要があります。たとえば、Warehouse_Source = Aで検索することができます。データモデルを変更することはできません。

アドバイスをいただければ幸いです!ここで

よろしく、 マーク

答えて

7
SELECT source.Warehouse as Warehouse_Source 
, dest.Warehouse as Warehouse_Destination 
, source.ItemNumber 
, source.DateStamp 
FROM table source 
JOIN table dest ON source.ID = dest.ID 
    AND source.ItemNumber = dest.ItemNumber 
    AND source.DateStamp = dest.DateStamp 
    AND source.TimeStamp = dest.TimeStamp + 1 
+0

パーフェクト!ありがとうございました... –

0

マーク、

あなたはROW_NUMBERとPIVOTでこれを行うことができる方法です。私が示唆しているように、列上のクラスタード・インデックスまたは主キーを使用すると、並べ替え操作のない直線のクエリプランが使用されるため、特に効率的です。

create table T(
    Warehouse char, 
    DateStamp datetime, 
    TimeStamp int, 
    ItemNumber varchar(10), 
    ID int, 
    primary key(ItemNumber,DateStamp,ID,TimeStamp) 
); 
insert into T values ('A','20090801','10001','abc','1'); 
insert into T values ('B','20090801','10002','abc','1'); 
insert into T values ('A','20090803','12144','qrs','5'); 
insert into T values ('C','20090803','12143','qrs','5'); 
insert into T values ('D','20090805','6754','xyz','6'); 
insert into T values ('B','20090805','6755','xyz','6'); 

with Tpaired(Warehouse,DateStamp,TimeStamp,ItemNumber,ID,rk) as (
    select 
    Warehouse,DateStamp,TimeStamp,ItemNumber,ID, 
    row_number() over (
     partition by ItemNumber,DateStamp,ID 
     order by TimeStamp 
    ) 
    from T 
) 
    select 
    max([1]) as Warehouse_Source, 
    max([2]) as Warehouse_Destination, 
    ItemNumber, 
    DateStamp 
    from Tpaired 
    pivot (
    max(Warehouse) for rk in ([1],[2]) 
) as P 
    group by ItemNumber, DateStamp, ID; 
go 

drop table T; 
関連する問題