2013-03-01 2 views
1

필자는 필자의 요구에 정확히 맞는 해결책을 찾지 못했지만 수정할 수있는 솔루션을 찾을 수 없습니다. 나는 데이터베이스 테이블을 가지고 있는데, 간략하게 세 열 (packageID, carriersequence)이 있다고합니다. 모든 패키지에는 패키지를 처리 ​​한 하나 이상의 통신 사업자가있을 수 있습니다. 내가 생각해야 할 것은 같이 행에 결과를 얻을 수 있습니다가변 길이 DB 행을 단일 열로 변환

packageID, carrier 
1, Bob 
1, Jim 
1, Sally 
1, Ron 
2, Reggie 
2, Mary 
2, Bruce 

: 나는처럼 보이는 패키지를 처리 ​​한 모든 사람들의 목록을 얻을 수

SELECT packageID, carrier 
FROM packageFlow 
ORDER BY sequence 

같은 쿼리를 수행 할 수 있습니다 :

packageID|carrier1|carrier2|carrier3|carrier4 
    1  |Bob  |Jim  |Sally |Ron 
    2  |Reggie |Mary |Bruce 

피벗 내가 아무것도 집계되지 그리고 난이 CTE 중 하나를 제대로 작동시킬 수 없기 때문에 무엇을해야하지 않는 것 같습니다. 나는 올바른 방향으로 조금 움직여 주셔서 감사합니다.

+0

당신이 사용하고있는 RDBMS 사항을 알려주십시오한다. 오라클 'LEAD'는 이런 종류의 일을 돕습니다. – Marc

+1

중복 http://stackoverflow.com/questions/5031204/does-t-sql-have-an-aggregate-function-to-concatenate-strings? – mdn

+0

DBMS를 지정하지 않았지만 [이 답변] (http://stackoverflow.com/questions/10791247/sql-server-possible-pivot-solution/10796492#10796492)에는 대부분의 DMBS에 대한 해결책이 있습니다. – GarethD

답변

2

이 데이터 변환은 PIVOT입니다. SQL Server 2005부터 행을 열로 변환하는 함수가 있습니다.

select * 
from 
(
    select packageid, carrier, 
    'Carrier_'+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col 
    from packageflow 
) src 
pivot 
(
    max(carrier) 
    for col in (Carrier_1, Carrier_2, Carrier_3, Carrier_4) 
) piv 

SQL Fiddle with Demo를 참조하십시오 : 당신이 값의 알려진 번호가있는 경우

, 당신은 하드 코드 조회를 할 수 있습니다.

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(t.col) 
        from 
        (
         select 'Carrier_'+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col 
         from packageFlow 
        ) t      
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT packageid,' + @cols + ' from 
      (
       select packageid, carrier, 
        ''Carrier_''+cast(row_number() over(partition by packageid order by packageid) as varchar(10)) col 
       from packageflow 
      ) x 
      pivot 
      (
       max(carrier) 
       for col in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo를 참조하십시오 : 당신은 당신이 열로 전환 할 Carrier 값을 알 수없는 번호가있는 경우

는, 당신은 동적 SQL을 사용할 수 있습니다.

참고 : 두 쿼리의 order by packageid

order by sequence와 그 결과를 대체는 다음과 같습니다

| PACKAGEID | CARRIER_1 | CARRIER_2 | CARRIER_3 | CARRIER_4 | 
------------------------------------------------------------- 
|   1 |  Bob |  Jim |  Sally |  Ron | 
|   2 | Reggie |  Mary |  Bruce | (null) | 
+0

정말 대단해 !! 고마워, 나는 피벗 테이블을 사용하는 전체 부분에 너무 싸서 그것을 지나칠 수 없었다. – dsvick

+0

@dsvick 당신이 일할 수있어서 기쁩니다. 언제나 도와 드리겠습니다! :) – Taryn

+0

@bluefeet 밝은 미래로 스택 오버 플로우 피벗. – Zane