2013-02-01 14 views
15

IDがある表に行のグループがあります。私は複数の列を持つ行でそれを平坦化しようとしています。私はこれをcteと多分パーティションで行っていることはほとんど確信しています。列を行に展開しようとしています

私はcteを使用して重複データを削除しましたが、私がここで達成しようとしているものに似た何かをしたと思いました。私は実行可能な解決策(下にリストされています)を考え出すことができましたが、より洗練されたソリューションが利用可能になるはずです。 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

関連する問題