SQL SELECT和INSERT / UPDATE,PIVOT?

时间:2016-10-24 10:18:34

标签: sql-server tsql sql-server-2012 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

我已使用INSERT尝试(SUB)SELECT,之后使用INSERTDISTINCT首先尝试UPDATE包名称,并使用PIVOT进行游戏和那样的东西。

但是我对SQL和编程很新,所以我无法想出一个解决方案。由于我不仅在源表中有版本号,而且还有nvarchar列,看起来PIVOT似乎不可能,对吧?

1 个答案:

答案 0 :(得分: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;