2012-10-04 1 views
0
내가 하나에 여러 행을 결합하려는

에 따라 새 행을 가지고 있지만 새로운 행이하나에 여러 행을 결합하지만 값

IncomingNumber QueNumber Datetime 
-------------- --------- ------------------- 
12345678  1   2012-01-01 09:01:00 
12345678  2   2012-01-01 09:02:00 
12345678  3   2012-01-01 09:05:00 
12345678  2   2012-01-01 09:07:00 
12345678  3   2012-01-01 09:08:00 
12345678  1   2012-01-01 09:10:00 
12345678  2   2012-01-01 09:11:00 
12345678  3   2012-01-01 09:13:00 
09876543  1   2012-01-01 09:01:00 
09876543  2   2012-01-01 09:02:00 
09876543  1   2012-01-01 09:05:00 
09876543  2   2012-01-01 09:06:00 
09876543  3   2012-01-01 09:08:00 

는 어떻게 그래서 모든 시간이 QueNumber 필드에 1이 나타납니다가 새 레코드의 데이터가

IncomingNumber Datetime1   Datetime2   Datetime3   Datetime4   Datetime5 
-------------- ------------------- ------------------- ------------------- ------------------- ------------------- 
12345678  2012-01-01 09:01:00 2012-01-01 09:02:00 2012-01-01 09:05:00 2012-01-01 09:07:00 2012-01-01 09:08:00 
12345678  2012-01-01 09:10:00 2012-01-01 09:11:00 2012-01-01 09:13:00 Null     Null 
09876543  2012-01-01 09:01:00 2012-01-01 09:02:00 Null     Null     Null 
09876543  2012-01-01 09:05:00 2012-01-01 09:06:00 2012-01-01 09:08:00 Null     Null 

처럼 보이게합니다. CTE 쿼리와 관련이 있다는 것을 알고 있지만 실제로 사용하지 않았고 전혀 사용하지 못했습니다.

+0

DBMS? SQL 서버? – RichardTheKiwi

+0

QueNumber 주문 중 휴식 시간을 기준으로 새 레코드를 찾고 있습니까? QueNumber 3 뒤에 2가 올 때처럼? – jTC

+0

이것은 SQL Server 2012에 대한 것입니다. QueNumber가 1 일 때만 새 레코드가되어야합니다. – Mcphee78

답변

3

Welcome to StackOverflow. DDL 및 샘플 데이터를 게시하면 도움을주기 위해 대개 다른 사람들을 돕습니다. 여기에 당신의 테이블 데이터가 있습니다.

create table tbl (IncomingNumber int,QueNumber int,Datetime datetime); 
insert tbl values 
    (12345678 ,1 ,'2012-01-01 09:01:00'), 
    (12345678 ,2 ,'2012-01-01 09:02:00'), 
    (12345678 ,3 ,'2012-01-01 09:05:00'), 
    (12345678 ,2 ,'2012-01-01 09:07:00'), 
    (12345678 ,3 ,'2012-01-01 09:08:00'), 
    (12345678 ,1 ,'2012-01-01 09:10:00'), 
    (12345678 ,2 ,'2012-01-01 09:11:00'), 
    (12345678 ,3 ,'2012-01-01 09:13:00'), 
    (09876543 ,1 ,'2012-01-01 09:01:00'), 
    (09876543 ,2 ,'2012-01-01 09:02:00'), 
    (09876543 ,1 ,'2012-01-01 09:05:00'), 
    (09876543 ,2 ,'2012-01-01 09:06:00'), 
    (09876543 ,3 ,'2012-01-01 09:08:00'); 

다음 쿼리는 최대 5 개의 datetime 열을 제공합니다. 어떤 행에서 5 개 이상의 열을 생성하면 추가 기능이 표시되지 않습니다. 나는 당신이 쉽게 확장 할 수있는 패턴을 사용했습니다. 아래쪽부터 계산하면 더 많은 datetime 열을 제공하기 위해 두 번째 줄과 네 번째 줄만 변경하면됩니다.

;with c1 as (
    select *,rn=ROW_NUMBER() over (partition by IncomingNumber order by DateTime) 
    from tbl 
), c2 as (
    select IncomingNumber,1 row,1 col,rn,DateTime 
    from c1 
    where rn=1 
    union all 
    select c1.IncomingNumber, 
      case when c1.QueNumber=1 then c2.row+1 else c2.row end, 
      case when c1.QueNumber=1 then 1 else c2.col+1 end, 
      c1.rn, 
      c1.DateTime 
    from c2 
    join c1 on c1.IncomingNumber=c2.IncomingNumber and c1.rn=c2.rn+1 
) 
select IncomingNumber,[1][DateTime1],[2][DateTime2],[3][DateTime3],[4][DateTime4],[5][DateTime5] 
from(select IncomingNumber,row,col,DateTime from c2)p 
pivot(max(DateTime)for col in([1],[2],[3],[4],[5]))v 
order by IncomingNumber,row 
+0

WOW는 정말 놀라워요. 정말 감사드립니다. 할 수만 있다면 파인트를 사 줄 것입니다. 어떻게 당신이 바로 어디서 시작 해야할지 모르겠다는 SQL 쿼리를 배웠습니까 – Mcphee78

+0

안녕하세요 한 번 더 질문 quenumber 3 때 나머지는 시간 null 값을 가진 연산자 열을 추가 할 필요가 이걸 피벗에 어떻게 추가할까요? – Mcphee78

+0

괜찮습니다. 어떻게하는지 알아 냈습니다. – Mcphee78