2015-02-06 4 views
-10

다음 데이터 집합이 있습니다.이 쿼리 SQL Server가 필요합니다

http://i57.tinypic.com/sn2y6a.jpg

그리고 난 다음과 같이이 데이터를 정렬하기 위해 열심히 노력하고 있습니다.

그래서 아래는 출력 데이터입니다.

http://i58.tinypic.com/xptth2.jpg

1) 새로운 칼럼 종료 날짜가있다. StartDate에 대해 하나/중복 레코드가있는 경우 으로 계산되고, StartDate로 가져온 다음 가장 가까운 다음 날짜가 EndDate 여야합니다. 다음 행의 경우이 EndDate는 StartDate 여야하며이 시작 날짜에 가장 가까운 다음 번호가 EndDate 여야하며 ID에 대해 계속해야합니다.

2) ID 1의 경우 4 개의 레코드가 있습니다. 이 ID의 경우 FirstName에 대한 레코드가 하나 있으면 선택해야하며 Null은 제거해야합니다. 그리고 LastName과 심지어 MiddleName에 대해서도 마찬가지입니다.

+0

링크 중 하나가 잘못 되었나요? –

+0

죄송합니다 JamesZ. 그것의 정확한 지금 ... 당신의 도움을 감사하십시오 – SQLquery

+1

이 질문은 확실히 친밀한보십시오 ... http : //www.sqlservercentral.com/Forums/Topic1658378-23-1.aspx –

답변

0

데이터 형식은 커서를 사용하여 테이블 변수에 날짜를 모으고 일반 변수에 다른 필드를 모으는 것입니다. 행의 시작 날짜가 이전 행보다 이전이면 모아진 데이터를 다른 결과 테이블 변수에 추가하고 이전에 사용한 변수를 지우고 동일한 작업을 다시 수행하십시오.

0
select 
    ID, StartDate, 
    (select min(StartDate) from T as t2 where t2.ID = t1.ID and t2.StartDate > t1.StartDate) as EndDate, 
    (select max(FirstName) from T as t2 where t2.ID = t1.ID) as FirstName, 
    (select max(LastName) from T as t2 where t2.ID = t1.ID) as LastName, 
    (select max(MiddleName) from T as t2 where t2.ID = t1.ID) as MiddleNameName 
from T as t1 
group by ID, StartDate 

테이블의 이름을 대체하십시오. 대신 CROSS APPLY으로 작성하는 것이 좋습니다. 그리고 저는 MAX()을 사용할 때 몇 가지 가정을하고 있습니다.

+0

그건 다른 "Shawn"이었습니다. – shawnt00