2010-02-26 7 views
6

여기에서 question이 같은 제목으로 stackoverflow에 있지만 내가 찾고있는 것은 아닙니다.
는 나는이SQL Server 2005에서 행을 열로 변환하는 방법

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 

처럼 무언가로 설정이 결과를 trasform 필요

Name | Count 
----------------  
Chery | 257 
Drew | 1500 
Morgon | 13 
Kath | 500 
Kirk | 200 
Matt | 76 

아래와 같은 테이블이 어떻게이 사용하여 SQL 서버 2005 acheive합니까?

답변

5

herehere에 유래에 대답 비슷한 질문이 있습니다입니다.

당신은 this.Here 당신이 해봐 예 this 소스에서 참조 할 수있는 방법에 대한 예제와 설명이다 acheive하는 쿼리에 운영자 PIVOT를 사용해야합니다.

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt] 
을 따를 설명

쿼리의

1. 첫 번째 부분

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
         '],[' + t.Name 
       FROM TESTTABLE AS t 
       ORDER BY '],[' + t.Name 
       FOR XML PATH('') 
      ), 1, 2, '') + ']' 

---I assumed your tablename as TESTTABLE--- 
DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t.Name 
         FROM TESTTABLE AS t 
         ORDER BY '],[' + t.Name 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

SET @query = N'SELECT '+ @cols +' FROM 
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p 
PIVOT (MAX([Count]) FOR Name IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 

은 단일 행에 당신에게 당신의 이름 열 값의 좋은 평평 결과를 제공

lea STUFF 및 XML PATH에 대한 자세한 내용은 herehere입니다. (- 3 단계 PVT)

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3

2. SELECT + @cols + FROM 최종 결과 집합 coloumn 이름으로 모든 행을 선택한다.이 쿼리는 크로스 탭 결과를 생성하는 데 필요한 모든 데이터 행을 가져옵니다. 조회 후 (p)은 다음 단계 1.

(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p 

4. PIVOT 식

PIVOT (MAX (Count) FOR Name IN (@cols) AS pvt 

대한 질의를 만족시키기 위해 사용될 수있는 결과의 임시 테이블을 생성하는 실제 작업을 수행 요약 및

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 
+0

+1, 좋은 해결책과 답. TOP 100 PERCENT는 TOP 30으로 변경 될 수 있으므로 많은 행이있는 경우 열의 수를 초과하지 않도록주의하십시오. –

2

Using PIVOT and UNPIVOT을 참조하십시오.

당신은 다른 테이블에 테이블 반환 식을 변경하려면 PIVOTUNPIVOT 관계 연산자를 사용할 수 있습니다. PIVOT는 여러 열로 식에 하나의 열로부터의 출력을 상기 고유 값으로 표시하여 테이블 값 식 회전 그들이 최종 수배있는 모든 남은 열 값에 필요한 집계 수행 산출. UNPIVOT 은 테이블 값 식의 열을 값으로 회전하여 PIVOT에 대한 반대 작업을 수행합니다.

빠른 대답은

SELECT Chery, Drew, Morgon, Kath, Kirk, Matt 
FROM 
(SELECT [Name], [Count] From Foo) 
PIVOT 
(
    MIN([Count]) 
    FOR [Name] IN (Chery, Drew, Morgon, Kath, Kirk, Matt) 
) AS PivotTable 
0

당신은 피벗 또는 허용 대답처럼 복잡한 것을 피하려면, 당신이 할 수있는 PVT라는 결과를 임시 테이블에 넣습니다! (대부분의 코드는 테스트 데이터를 설정하려는 사람에게 유용합니다.)

/* set up your test table */ 
declare @TestData table (Name Varchar(80),[Count] int)  
insert into @TestData (Name, [count]) 
Select 'Chery' as name, 257 as [count] 
union all select 'Drew', 1500 
union all select 'Morgon',13 
union all select 'Kath', 500 
union all select 'Kirk', 200 
union all select 'Matt', 76 

/* the query */ 
Declare @Query Varchar(max) 
Select @Query=Coalesce(@query+', ','SELECT ') +Convert(VarChar(5),[count]) +' as ['+name+']' 
from @TestData 
Execute (@Query) 
/* result 

Chery  Drew  Morgon  Kath  Kirk  Matt 
----------- ----------- ----------- ----------- ----------- ----------- 
257   1500  13   500   200   76 

*/ 
관련 문제