2017-10-26 1 views
0

아래와 비슷한 표가 있습니다.SQL 서버에서 4 열로 행 변환

최대 ID에 대해 최대 4 가지 이유 행만있을 수 있습니다. 그 Reason 열을 4 열로 변환하고 다른 행을 제거하고 싶습니다. ID에 4 가지 이유가 없으면 여전히 4 개의 열로 분할하여 NULL로 만듭니다. 동일한 이유가있는 ID의 경우 하나의 열에 반복하여 표시하고 다른 열은 NULL로 만듭니다.

이유 열 필요

예상 결과는 다음과 같습니다 뚜렷한 이유의 수에 따라 서로 다른 컬럼에 분할 할 수 있습니다. 테이블 :

ID Date Reason 
100 10/27/2017 Insufficient 
100 10/27/2017 Excessive 
101 10/20/2017 Excessive 
101 10/20/2017 Excessive 
101 10/20/2017 Insufficient 
101 10/20/2017 Derog 
105 10/24/2017 Length 
106 10/10/2017 Dismiss 
107 10/10/2016 Rejected 
108 10/10/2016 Dismiss 

예상 결과 : 여기

ID Date Reason1 Reason2 Reason3 
100 10/27/2017 Insufficient Excessive NULL 
101 10/20/2017 Excessive Insufficient Derog 
105 10/24/2017 Length NULL NULL 
106 10/10/2017 Dismiss NULL NULL 
107 10/10/2016 Rejected NULL NULL 
108 10/10/2016 Dismiss NULL NULL 
+0

.. – HadoopAddict

+0

의 ID는 최대 3 뚜렷한 이유가 없다 .. – HadoopAddict

+0

이 사고가 아니었다 아니, 그것은 의도적이었다 .. 그들은 제거 할 필요가 중복이있는 경우. – HadoopAddict

답변

3

는 4 열 최대가있는 경우이 작업을 수행 할 방법이다. 다섯 번째 열이 있다면이 열에 나타나지 않습니다. 동적으로 열 개수를 처리하려면 동적 SQL을 사용해야하고 복잡성이 매우 빠르게 증가한다는 것을 의미합니다.

declare @Something table 
(
    ID int 
    , MyDate date 
    , Reason varchar(20) 
) 

insert @Something values 
(100, '10/27/2017', 'Insufficient') 
, (100, '10/27/2017', 'Excessive') 
, (101, '10/20/2017', 'Excessive') 
, (101, '10/20/2017', 'Excessive') 
, (101, '10/20/2017', 'Insufficient') 
, (101, '10/20/2017', 'Derog') 
, (105, '10/24/2017', 'Length') 
, (106, '10/10/2017', 'Dismiss') 
, (107, '10/10/2016', 'Rejected') 
, (108, '10/10/2016', 'Dismiss') 
; 

select x.ID 
    , Result1 = MAX(case when RowNum = 1 then Reason end) 
    , Result2 = MAX(case when RowNum = 2 then Reason end) 
    , Result3 = MAX(case when RowNum = 3 then Reason end) 
    , Result4 = MAX(case when RowNum = 4 then Reason end) 
from 
( 
    select * 
     , RowNum = ROW_NUMBER() over (partition by ID order by MyDate) 
    from @Something 
    group by ID, Reason, MyDate 
) x 
group by x.ID 
내가 SQL 서버를 사용하고
+0

이제 5 대신 4 열을 원합니다. 아니요, 이제 막 4 열을 추가했습니다. –

+0

Thanks @SqlZim. 오히려 어리 석다. :) ROW_NUMBER를 사용하는 쿼리에서는 고유 한 것이므로 모두 구별됩니다. –