2013-02-01 28 views
15

Tôi có một nhóm các hàng trong một bảng có id. Tôi đang cố gắng để làm phẳng nó ra trong hàng với nhiều cột. Tôi gần như chắc chắn tôi đã làm điều này với một cte và có thể phân vùng.cố gắng làm phẳng các hàng thành các cột

Tôi đã sử dụng cte để xóa dữ liệu trùng lặp và tôi nghĩ rằng tôi đã làm điều gì đó tương tự như những gì tôi đang cố gắng thực hiện ở đây. Tôi đã có thể đưa ra giải pháp khả thi (được liệt kê dưới đây) nhưng vẫn cảm thấy như một giải pháp thanh lịch hơn nên có sẵn.

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 

--trying để thực hiện điều này với CTE/phân vùng:

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 

Trả lời

19

chuyển đổi dữ liệu này được biết đến như một PIVOT. Trong SQL Server 2005+ có một hàm sẽ thực hiện quá trình này. :

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

Xem SQL Fiddle with Demo.

Hoặc bạn có thể sử dụng một chức năng tổng hợp với một biểu thức 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 

Xem SQL Fiddle with Demo.

Bạn cũng có thể sử dụng nhiều tham gia vào bảng của bạn:

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' 

Xem SQL Fiddle with Demo

Kết quả cho tất cả các phiên bản là như nhau:

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

cảm ơn rất nhiều. trục là hoàn toàn những gì tôi đang tìm kiếm. tôi đã thử điều đó nhưng không sử dụng max(). cảm ơn một lần nữa. – boone

+0

@boone bạn được chào đón !! :) – Taryn

+0

tính năng rất hữu ích, cảm ơn – AlexFoxGill