2013-07-30 4 views
1

잠시 동안 SQL을 사용해 왔지만 여전히 멍청하다. 그래서 도움을 청한다. 사이트를 이미 검색했지만 달성하고자하는 것을 찾지 못했습니다.열 데이터를 행으로 변환하고 열 이름을 증가시키는 SQL

VisitNumber ID 
39332  759666 
39332  769445 
39332  775795 
40329  762595 
40329  769447 
40329  775796 
40329  783782 
39332  783781 
39332  861130 

이 사람 : :

나는 다음과 같이 두 개의 열을 SQL을 사용하려는

VistNumber ID1 ID2 ID3 ID4 ID5 
39332  759666 769445 775795 783781 861130 
40329  762595 769447 775796 783782 NULL 

내가 PIVOT을 사용하여 생각했지만, 난 정확히 방법을 잘 모르겠어요 Count(), Min(), Max() 등을 사용하지 않기 때문에 피벗 부분을 수행하십시오. 도움/제안을 보내 주시면 감사하겠습니다.

+0

당신이 MSSQL 서버를 사용하십니까 : 모든 버전은 결과를 줄 것이다? – valex

+0

예 MSSQL Server를 사용하고 있습니다. – Kenry87

+0

ID가 별도의 열 또는 목록에 필요합니까? VisitNumber에 5 개 이상의 ID가있을 수 있습니까? – BWS

답변

1

SQL Server를 사용하고 있기 때문에 결과를 얻을 수있는 여러 가지 방법이 있지만 모두에 row_number()을 사용해야합니다.

당신은 CASE 표현식으로 집계 함수를 사용할 수 있습니다

select visitnumber, 
    max(case when seq=1 then id end) ID1, 
    max(case when seq=2 then id end) ID2, 
    max(case when seq=3 then id end) ID3, 
    max(case when seq=4 then id end) ID4, 
    max(case when seq=5 then id end) ID5 
from 
(
    select visitnumber, id, 
    row_number() over(partition by visitnumber 
         order by id) seq 
    from yourtable 
) d 
group by visitnumber; 

SQL Fiddle with Demo

당신은 PIVOT 기능을 사용할 수 있습니다 참조 :

select visitnumber, ID1, ID2, ID3, ID4, ID5 
from 
(
    select visitnumber, id, 
    'ID'+cast(row_number() over(partition by visitnumber 
           order by id) as varchar(10)) seq 
    from yourtable 
) d 
pivot 
(
    max(id) 
    for seq in (ID1, ID2, ID3, ID4, ID5) 
) piv; 

SQL Fiddle with Demo를 참조하십시오. 당신은 당신이 5 아이디의 최대있을 것이라고 주장하지만 알 수없는 번호가 있다면, 당신은 결과를 얻기 위해 동적 SQL을 사용할 수

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('ID'+cast(row_number() over(partition by visitnumber 
           order by id) as varchar(10))) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT visitnumber,' + @cols + ' 
      from 
      (
       select visitnumber, id, 
        ''ID''+cast(row_number() over(partition by visitnumber 
               order by id) as varchar(10)) seq 
       from yourtable 
      ) x 
      pivot 
      (
       max(id) 
       for seq in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo를 참조하십시오.

| VISITNUMBER | ID1 | ID2 | ID3 | ID4 | ID5 | 
------------------------------------------------------------ 
|  39332 | 759666 | 769445 | 775795 | 783781 | 861130 | 
|  40329 | 762595 | 769447 | 775796 | 783782 | (null) | 
+0

은 피벗 솔루션과 같습니다. –

0
with CTE as 
(

select t.VisitNumber, 
     t.Id, 
     ROW_NUMBER() over (PARTITION BY VisitNumber 
          ORDER BY ID) rn 
from t 
) 

SELECT VisitNumber, 
[1], [2], [3], [4],[5] 
FROM CTE 
PIVOT 
(
AVG(ID) 
FOR RN IN ([1], [2], [3], [4],[5]) 
) AS PivotTable 

SQLFiddle demo

+0

완벽하게 작동했지만 다른 사람이 내 문제에 부딪치게되면 다른 사람이 5 개 이상의 ID를 가질 수 있기 때문에 답변으로 다른 하나를 선택했습니다. – Kenry87

관련 문제