2013-02-01 1 views
15

ID가있는 테이블에 행 그룹이 있습니다. 나는 여러 열이있는 행에서 그것을 평평하게하려고 노력하고있다. 나는 거의 cte와 어쩌면 파티션으로 이것을 해냈다.열을 행으로 병합하려고 시도합니다.

필자는 중복 된 데이터를 삭제하기 위해 cte 's를 사용했으며, 여기에서 성취하고자하는 것과 비슷한 것을 수행했다고 생각했습니다. 나는 실행할 수있는 해결책을 제시 할 수 있었지만 (여전히 아래에 열거 됨)보다 우아한 해결책이 있어야한다고 생각합니다. CTE/파티션이를 위해 --trying

CREATE TABLE #MyTable (RowID int , field VARCHAR(10), value VARCHAR(10)) 

INSERT INTO #MyTable (RowID, field, value) VALUES (1, 'first', 'neil') 

INSERT INTO #MyTable (RowID, field, value) VALUES (2, 'first', 'bob' ) 

INSERT INTO #MyTable (RowID, field, value) VALUES (3, 'first', 'tom' ) 

INSERT INTO #MyTable (RowID, field, value) VALUES (1, 'last', 'young') 

INSERT INTO #MyTable (RowID, field, value) VALUES (2, 'last', 'dylan') 

INSERT INTO #MyTable (RowID, field, value) VALUES (3, 'last', 'petty') 

SELECT * FROM #mytable 

:

SELECT rowid, 
    [first] = (Select value FROM #mytable where field = 'first' and rowid = t.rowid), 
    [last] = (Select value FROM #mytable where field = 'last' and rowid = t.rowid) 
FROM #mytable t 
GROUP BY rowid 

답변

19

이 데이터 변환은 PIVOT로 알려져있다. SQL Server 2005 이상에서는이 프로세스를 수행하는 기능이 있습니다. :

select * 
from 
(
    SELECT * 
    FROM mytable 
) src 
pivot 
(
    max(value) 
    for field in (first, last) 
) piv 

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

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

select rowid, 
    max(case when field = 'first' then value end) first, 
    max(case when field = 'last' then value end) last 
from MyTable 
group by rowid 

SQL Fiddle with Demo를 참조하십시오. 또한 여러 사용할 수 있습니다

은 테이블에 조인

select t1.rowid, 
    t1.value first, 
    t2.value last 
from mytable t1 
left join mytable t2 
    on t1.rowid = t2.rowid 
    and t2.field = 'last' 
where t1.field = 'first' 

모든 버전에 대한 SQL Fiddle with Demo

결과는 동일 참조 :

| ROWID | FIRST | LAST | 
------------------------- 
|  1 | neil | young | 
|  2 | bob | dylan | 
|  3 | tom | petty | 
+1

덕분에 너무 많은. 피벗은 절대적으로 내가 찾고있는 것입니다. 나는 그것을 시도했지만 max()를 사용하지 않았다. 다시 한 번 감사드립니다. – boone

+0

@boone 당신을 환영합니다 !! :) – Taryn

+0

매우 유용한 기능, 감사합니다 – AlexFoxGill