2014-07-17 4 views
0

제목에 대한 다른 게시물을 보려고했지만 필자가 보았던 모든 예제는 특정 값을 알고있는 것을 기반으로합니다. 내가 가진 무엇SQL Server 2008 관리 Studio : 행 데이터를 열로 변환하십시오.

예 : 내가 원하는 것을

Address  Name  Number 
-------  ------- ------- 
1234 Main  Bob  555-555-5555 
1234 Main  Karen 444-444-4444 
1990 Maple Susie 333-333-3333 
1010 12th  Joe  222-222-2222 
1010 12th  Beth  111-111-1111 
1010 12th  Steve 444-433-3221 

예 :

Address  Contact1    Contact2    Contact3 
-------  -------    --------    -------- 
1234 Main Bob:555-555-5555  Karen:444-444-4444  NULL 
1990 Maple Susie:333-333-3333  NULL    NULL 
1010 12th Joe: 222-222-2222 Beth 111-111-1111 Steve 444-433-3221 

행의 수천이있다 그래서 난 안 CASE와 .. 나는보다 더 해요 수 여기 좀 잃어 버렸어.

제안 사항?

+0

예,에 대한 검색을 수행을 [동적 피벗 (http://stackoverflow.com/search?q=%5Bsql-server%5D+dynamic+pivot)이 가정 – Lamak

+0

나는 보았다 많은 사람들이 다음과 같은 질문을합니다. (행을 열로 변환) ... 그들은 검색 대신 질문을 작성합니다 ... – Jesuraja

답변

1

다음 쿼리를 사용할 수 있다고 생각합니다. 이것은 당신이 최대 세 개의 연락처

;WITH orderedAddress(Address,Name,Number,Sort) 
AS 
(
SELECT Address,Name,Number,ROW_NUMBER() OVER(PARTITION BY Address ORDER BY Name) AS num 
FROM Addresses 
) 
SELECT main.Address,Contact1.Name + ':' + Contact1.Number AS Contact1 , 
Contact2.Name + ':' + ISNULL(Contact2.Number,'') AS Contact2 , 
Contact3.Name + ':' + ISNULL(Contact3.Number,'') AS Contact3 
FROM 
(SELECT DISTINCT Address FROM Addresses) AS main 
LEFT JOIN OrderedAddress Contact1 ON main.Address = Contact1.Address AND Contact1.Sort=1 
LEFT JOIN OrderedAddress Contact2 ON main.Address = Contact2.Address AND Contact2.Sort=2 
LEFT JOIN OrderedAddress Contact3 ON main.Address = Contact3.Address AND Contact3.Sort=3 
+0

당신은 이미 연락처가 최대 3 개인 것을 결정했습니다. 그는 동적 솔루션을 원한다고 말합니다 – Lamak

1

동적 피벗이 작동하지만 동적 교차 탭도 작동합니다. 일반적으로 크로스 탭은 성능 향상을 위해 피벗을 이깁니다. 다음은 몇 일 전에 게시 한 예입니다.

if OBJECT_ID('Something') is not null 
    drop table Something 

create table Something 
(
    ID int, 
    Subject1 varchar(50) 
) 

insert Something 
select 10868952, 'NUR/3110/D507' union all 
select 10868952, 'NUR/3110/D512' union all 
select 10868952, 'NUR/4010/D523' union all 
select 10868952, 'NUR/4010/HD20' union all 
select 12345, 'asdfasdf' 
declare @MaxCols int 

declare @StaticPortion nvarchar(2000) = 
    'with OrderedResults as 
    (
     select *, ROW_NUMBER() over(partition by ID order by Subject1) as RowNum 
     from Something 
    ) 
    select ID'; 

declare @DynamicPortion nvarchar(max) = ''; 
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by ID order by ID'; 

with E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
cteTally(N) AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
) 

select @DynamicPortion = @DynamicPortion + 
    ', MAX(Case when RowNum = ' + CAST(N as varchar(6)) + ' then Subject1 end) as Subject' + CAST(N as varchar(6)) + CHAR(10) 
from cteTally t 
where t.N <= 
(
    select top 1 Count(*) 
    from Something 
    group by ID 
    order by COUNT(*) desc 
) 

select @StaticPortion + @DynamicPortion + @FinalStaticPortion 

declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion; 
exec sp_executesql @SqlToExecute 
+0

* 일반적으로 크로스 탭은 성능 향상을 위해 피벗을 수행합니다 *, 리소스에 대한 링크가 있습니까? 그 진술서를 다시 올려라.? 그리고 똑같은 답을 게시하는 것이 좋은 대답이라고 생각하면 그 질문은 중복이라는 것을 의미합니다 – Lamak

+0

그냥 내 말을 듣지 않는다는 뜻입니까? LOL. 여기 제프 모덴 (Jeff Moden)의 크로스 탭에 관한 기사가 있습니다. 그는 정적 및 동적 크로스 탭 대 피벗을 비교합니다. 교차 탭의 또 다른 큰 이점은 여러 집계를 가질 수 있다는 것입니다. http://www.sqlservercentral.com/articles/T-SQL/63681/ –

+0

좋아요, 나는 그 글을 읽었습니다. "집계 테이블"이나 동적 SQL 수행과 관련이없는 것을 볼 수 있습니다. 답변에 꽤 많은 것들이 추가됩니다. – Lamak

관련 문제