2015-01-14 3 views
1

이 SQL 문제를 생각하고 주문하는 방법에 도움이 필요합니다. 실제 코드와 다를 수 있습니다.PIVOT에 둘 이상의 값을 연대순으로 입력하십시오.

[First Name] 
[Last Name] 
[SSN] 
[Administration] // Who conducted the background check 
[Date of Birth]  // This field is often null 
[Result]   // Possible values are 'No Record', 'Record', or Null 
[ResultDate] 

대부분의 사람들은 하나 이상의 배경 조사가 :

나는 배경의 큰 테이블 내 필드는 확인해야합니다. 예를 들어, John Doe는 2011 년 1 월 1 일에 Administration X의 배경과 2012 년 1 월 1 일에 관리 Y가 배경을 가질 수 있습니다.

나는 PIVOT 결과, 결과 날짜 및 관리를 연대순으로 정리하고 싶습니다. 예를 들어 레코드를 읽을 수 있습니다

John Doe - 'Record' - 1/1/2011 - Administration X - 'Record' on 1/1/2013 

나는 이것을 수행하는 방법을 알아낼 수 없습니다. 세 가지 필드를 기반으로 어떻게 피벗하겠습니까? 세 가지 다른 필드 (Result, ResultDate, Administration)를 기반으로 피벗 할 수 있다면 ResultDate를 기준으로 시간순으로 순서를 지정할 수 있습니까?

답변

1

당신은 이름과 사회 보장 번호 (SSN)하여 결과 날짜를 정렬하고 결과, 결과의 날짜 및 관리 열을 연결하는 row_number를 사용할 수 있습니다

-- load sample data 
if object_id('tempdb..#background_checks','u') is not null 
    drop table #background_checks 
create table #background_checks 
    (
    [First Name] varchar(50), 
    [Last Name] varchar(50), 
    [SSN] char(11), 
    [Administration] varchar(50), 
    [Result] varchar(50), 
    [Result Date] date 
    ) 
insert into #background_checks 
    values 
     ('John','Doe',NULL,'Administration X','Record','2011-01-01'), 
     ('John','Doe',NULL,'Administration Y','Record','2012-01-01'), 
     ('John','Doe',NULL,'Administration Z','No Record','2013-01-01') 

-- pivot results 
select 
    [First Name], 
    [Last Name], 
    [1] as [Result 1], 
    [2] as [Result 2], 
    [3] as [Result 3] 
from (select 
     [First Name], 
     [Last Name], 
     [Result] + ' - ' + 
      convert(varchar(10),[Result Date],101) + ' - ' + 
      [Administration] as [Result], 
     row_number() over(partition by [First Name],[Last Name],[SSN] 
      order by [Result Date]) as ColumnID 
     from #background_checks) t 
     pivot (
      max([Result]) for ColumnID in([1],[2],[3]) 
      ) p1 
관련 문제