2016-09-15 2 views
3

나는 테이블 설명했다SQL 서버에서 문자열 값을 돌리고 필요

Designer | Developer | Coder 
---------+-----------+-------- 
    X  |  A  | Y 
    Null |  B  | Z 

수 아무도 이것에 도움이 되니?

SELECT [Developer], 
     [Designer], 
     [Coder] 
FROM (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL)) RN 
    FROM #temp 
) as t 
PIVOT (
    MAX(Name) FOR Occupation IN ([Developer],[Designer],[Coder]) 
) as pvt 

출력 : : 당신을 위해 일을 할 것입니다

+0

Z가 B에 바인딩되어 있고 디자이너가 없는데 Y가 X와 A에 바인딩되어 있음을 데이터에서 어떻게 알 수 있습니까? – Shnugo

+0

나는 행 번호 함수를 사용하여 연산 문자열에 의해 분할 된 값을 정렬 한 다음 결과를 피벗시키고 자 할 것입니다 ... – ZLK

+0

그 관계는 없습니다 .. 데이터는 알파벳순으로 정렬됩니다 .. 피벗 후 –

답변

2

ROW_NUMBER (과 기본 PIVOT) 사전에

감사

Developer Designer Coder 
A   X   Y 
B   NULL  Z 

만약 Occupation의 수 수도 매우 다음 당신 동적 SQL이 필요함 :

DECLARE @columns nvarchar(max), 
     @sql nvarchar(max) 

SELECT @columns = (
    SELECT DISTINCT ','+QUOTENAME(Occupation) 
    FROM #temp 
    FOR XML PATH('') 
) 

SELECT @sql = N' 
SELECT '+STUFF(@columns,1,1,'')+' 
FROM (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL)) RN 
    FROM #temp 
) as t 
PIVOT (
    MAX(Name) FOR Occupation IN ('+STUFF(@columns,1,1,'')+') 
) as pvt' 

EXEC sp_executesql @sql 

참고 : 나는 무작위 순서를 얻기 위해서 ORDER BY (SELECT NULL)을 사용했습니다. 이 목적을 위해 실제 필드를 사용하는 것이 더 좋습니다.

+0

'ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL))'는 어떤 순서를 정의 할 것입니다. 그러나 이것은 예측할 수 없습니다. 나는이 접근법이 작동한다고해도 말하고 싶습니다. -하지 말아야 할 것입니다 ... – Shnugo

+0

'(SELECT NULL)'대신 @Shnugo OP는 그가 원하거나 필요로하는 필드를 사용할 수 있습니다. 그것은 단지 예일뿐입니다. 개인적으로 정렬 할 필드가없는 경우 이러한 정렬을 사용하며 이는 회사 (회사) DB에서 드문 것입니다. – gofr1

+0

고마워요. U r savier! 나는 그것에 시간을 투자했다 : .. ( –

관련 문제