2016-10-24 6 views
0

私はこのようになりますテーブルからデータを取得する必要があります。SQL SELECTおよびINSERT/UPDATE、PIVOT?

name | server | instance | version | user 
----------|----------|------------|----------|--------- - 
package_a |  x |  1  | 1  | AB 
package_b |  x |  1  | 1  | TL 
package_a |  x |  2  | 4  | SK 
package_a |  y |  1  | 2  | MD 
package_c |  y |  1  | 4  | SK 
package_b |  y |  2  | 1  | SK 
package_a |  y |  2  | 1  | TL 
package_b |  x |  2  | 3  | TL 
package_c |  x |  2  | 1  | TL 

と私はそのようなテーブルに置く必要があります。

name | v_x_1 | u_x_1 | v_x_2 | u_x_2 | v_y_1 | u_y_1 | v_y_2 | u_y_2 
----------|-------|-------|-------|-------|-------|-------|-------|------- 
package_a | 1 | AB | 4 | SK | 2 | MD | 1 | TL 
package_b | 1 | TL | 3 | TL | NULL | NULL | 1 | SK 
package_c | NULL | NULL | 1 | TL | 4 | SK | NULL | NULL 

私はすでにしようとした、(SUB)SELECTINSERTを試してみましたINSERT最初にDISTINCTUPDATEを使用するパッケージ名は、PIVOTとそのようなもので回った。

しかし、私はSQLとプログラミングの面では一般的ではないので、解決策を見つけることができませんでした。私は元のテーブルにバージョン番号を持っているだけでなく、nvarcharの列を持っているので、PIVOTのように思えるでしょうか?

答えて

0

UNIONを使用するサブクエリでPIVOTを使用して、ユーザーとバージョンの値を区切ることができます。

insert into YourNewTable (name, [v_x_1],[u_x_1],[v_x_2],[u_x_2],[v_y_1],[u_y_1],[v_y_2],[u_y_2]) 
select * 
from (
    select name, cast([version] as varchar(30)) as value, concat('v_',[server],'_',instance) as title from YourTable 
    union all 
    select name, [user] as value, concat('u_',[server],'_',instance) as title from YourTable 
) q 
pivot (max(value) FOR title IN (
    [v_x_1],[u_x_1],[v_x_2],[u_x_2],[v_y_1],[u_y_1],[v_y_2],[u_y_2] 
) 
) pvt; 
+0

非常に助かります。ありがとうございます!最後の1時間ほど私はこの仕事を私のためにしようとしていましたが、できませんでした:[リンク] https://blogs.msdn.microsoft.com/kenobonn/2009/03/22/pivot-on-two- or-more-fields-in-sql-server / –