2009-09-01 7 views
0

도움이 필요한 흥미로운 SQL 문제가 있습니다.SQL 도움말 - 두 행을 한 행에 결합하기

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 

이 두 세트 사이의 재고 창고 전송을 나타낸다 : 여기

샘플 세트이다. 각 전송을 나타내는 두 개의 레코드가 있으며이 두 전송 레코드는 항상 동일한 ItemNumber, DateStamp 및 ID를가집니다. 두 전송 레코드의 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를 기본 데이터베이스로 사용하고 있습니다. 또한 SQL에 WHERE 절을 추가해야합니다. 예를 들어, Warehouse_Source = A에서 검색 할 수 있습니다. 아니요, 데이터 모델을 변경할 수 없습니다.).

모든 조언을 크게 듣습니다! 여기

는 ROW_NUMBER와 PIVOT이 할 수있는 방법입니다

감사합니다, 마크

답변

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

마크. 필자가 제안한대로 클러스터 된 인덱스 또는 기본 키를 사용하면 정렬 작업이없는 일직선 쿼리 계획을 사용하므로 특히 효율적입니다.

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; 
관련 문제