2012-09-20 4 views
3

클라이언트 수가 많으며 각 클라이언트에는 67 개의 레코드가 있습니다.데이터를 여러 열로 옮기기

레코드에는 활동, 날짜, ID, 플래그 및 기타 여러 열이 포함됩니다.

본인은 활동 이름을 해당 활동 제목의 제목 및 날짜로보고 싶습니다.

아래 표를 사용하여 더 설명하려고합니다. 이것은 현재 출력 :

Client Activity Date 
1  A   21/15 
1  B   5/5/2012 
1  C   51/3115 
1  D   54/6/84 
2  A   8/6/99 
2  B   1/1/2011 
2  C   8/4 
2  D   9/81/1 
3  A   6/51/8 
3  B   1/61/8 
3  C   1/31 
3  D   3/2/1 

그리고 나는 그것이 싶습니다 :

Client  A  B   C   D 
1   21/15 5/5/2012 51/31/15 54/6/84 
2   8/6/99 1/1/2011 8/4  9/81/1 
3   6/51/8 1/61/8 1/31  3/2/1 
+0

가능한 중복 [은 ​​(SQL 서버 동적 PIVOT 쿼리) COLUMNS로 행을 가져 오기] (http://stackoverflow.com/questions/12074939/get-rows-as-columns-sql- 서버 동적 피벗 쿼리) – RichardTheKiwi

답변

4

당신은이에 대한 PIVOT 기능을 사용하는 것이 좋습니다. 당신이 열을 알 수없는 번호가 다음 동적 버전을 사용하는 경우

select * 
from 
(
    select client, activity, dt 
    from yourtable 
) x 
pivot 
(
    max(dt) 
    for activity in ([A], [B], [C], [D]) 
) p 

SQL Fiddle with Demo

를 참조하십시오 : 당신이 열 수를 알고 있다면 당신은 정적 피벗을 통해 하드 코딩이 수 후 변환하는

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(activity) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT client,' + @cols + ' from 
      (
       select client, activity, dt 
       from yourtable 
      ) x 
      pivot 
      (
       max(dt) 
       for activity in (' + @cols + ') 
      ) p ' 

execute(@query) 

이는 또한 CASE 문 및 집계 기능을 수행 할 수 있습니다, 마지막으로

SQL Fiddle with Demo 참조 (SQL Fiddle with Demo 참조)의

select client, 
    max(case when activity = 'A' then dt end) as A, 
    max(case when activity = 'B' then dt end) as B, 
    max(case when activity = 'C' then dt end) as C, 
    max(case when activity = 'D' then dt end) as D 
from yourtable 
group by client 
+0

고마워요! –

+0

두 번째 옵션을 제공해 주셔서 감사합니다. 대단히 도움이되었습니다. – dbinott

관련 문제