2016-12-07 11 views
1

이 테이블에는 단일 열과 여러 행이있는 테이블의 세부 정보가 표시됩니다. 각 DATE 값 행 뒤의 행을 다른 열로 선택해야하는 방식으로 데이터를 출력해야합니다.단일 열과 여러 행이있는 테이블의 세부 정보를 가져 오는 SQL Server 쿼리

예를 들어 테이블의 첫 번째 행에는 datetime 값이 있고 그 뒤에 텍스트 값이있는 3 개의 행이 있으므로 출력 테이블의 날짜는 한 열에 다음 행의 값과 그 datetime 값. 요약하자면 한 열에 4 개의 다른 열이 있습니다.

마찬가지로 우리는 하나의 datetime 값과 하나 이상의 텍스트 값이있는 다른 행을 가지고 있습니다. 공통 문자를 기반으로 서로 다른 테이블에 각 행을 분할하고 this link에 설명 된 기술을 사용하여 단일 테이블로 질의하여 몇 가지 쿼리를 시도했습니다.

데이터가 원본 데이터에 해당되지 않는다 그러나

..

논리 또는 쿼리 도와주세요. 미리 감사드립니다.

snapshot of table

답변

1

는이 작업을 수행 할 수있는 여러 가지 방법이 있습니다. 질문에서 언급 한 the link에서 언급했듯이 ROW_NUMBER() 필드의 ORDER BY 절에 사용할 수있는 시퀀스가 ​​증가하는 다른 열이 필요할 것 같지만 파티션이있는 CTE가 작동 할 수도 있습니다.

또 다른 방법은 cursor을 사용하여 테이블의 값을 처리하고 그 결과를 임시 테이블에 저장하는 것입니다. 값이 유효한 날짜인지 확인하려면 isdate()을 사용하십시오. 아래의 예를 참조하십시오

declare @currentRow int =0; 
declare @valueCol int = 1; 
declare @column_mail varchar(100) 
declare @results table(date1 datetime,val1 varchar(100),val2 varchar(100),val3 varchar(100), rowNum int) 
declare DbCursor cursor for 

select column_mail from mail 
OPEN DBCursor 
FETCH NEXT FROM DBCursor INTO @column_mail 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     if (isdate(@column_mail) =1) 
     BEGIN 
      set @valueCol = 1;--reset 
      set @currentRow = @currentRow + 1; 
      insert into @results VALUES (@column_mail,null,null,null,@currentRow) 
     END 
     ELSE 
      BEGIN 
       if (@valueCol = 1) 
        update @results set val1 = @column_mail where rowNum = @currentRow 
       if (@valueCol = 2) 
        update @results set val2 = @column_mail where rowNum = @currentRow 
       if (@valueCol = 3) 
        update @results set val3 = @column_mail where rowNum = @currentRow 
       set @valueCol = @valueCol +1;  
     END 
     FETCH NEXT FROM DBCursor 
     INTO @column_mail 
    END 
CLOSE DBCursor 
DEALLOCATE DBCURSOR 

SELECT * FROM @results 

출력 :

results output

+0

안녕하세요 샘,이 코드는 잘 작동이 도움을 주셔서 감사합니다 .. 그것은 나에게 많은 도움이되었습니다. 나는 거대한 데이터를 가지고 똑같이 노력하고있다. –

+0

안녕하세요 샘, 코드에 문제가 있습니다 .1) 데이터가 25086743 개의 레코드에 도달했으며 쿼리에서 처리 할 수 ​​없습니다. 2) 다음으로 각 날짜 행 이후에 30-60 개의 전자 메일 ID 행이 있습니다. coulnt도 동적으로 처리합니다. 나는 여러 테이블로 데이터를 분할하는 것을 생각했지만, 우리는 여러 개의 복제본을 가지고 있기 때문에 바보가 아닙니다. 어떤 제안이 있습니까? –

+0

글쎄요.이 시점에서 필자는 PHP와 같은 스크립팅 언어를 사용하고 데이터로 작업하는 것이 좋습니다. 아마도 이미 데이터베이스에 연결되어있는 스크립트 언어를 사용하고있을 것입니다. –