重组数据(案例变量)SQL Server

时间:2018-09-20 18:11:44

标签: sql sql-server

我有下表:

ID    Var1   Var2   Var3
------------------------    
1      4      3      9
2      5      2      8
3      1      6      2

我想获得下表:

ID    Score     Variable
------------------------
1       4         Var1
1       3         Var2
1       9         Var3
2       5         Var1
2       2         Var2
2       8         Var3
3       1         Var1
3       6         Var2
3       2         Var3

非常感谢您的帮助!

非常感谢

3 个答案:

答案 0 :(得分:0)

您可以使用全部合并

    select  id, var1, score  'var1' variable
    from mytable
    union all  
    select  id, var2, 'var2' 
    from mytable
    union all  
    select  id, var3, 'var3' 
    from mytable
    order by  id, variable 

答案 1 :(得分:0)

为此,我建议使用cross apply

select t.id, v.variable, v.score
from followingtable t cross apply
     (values ('var1', t.var1), ('var2', t.var2), ('var3', t.var3)) v(variable, score);

还有另外两种(显而易见的)方法可以做到这一点。一个使用union all。此方法的优点是仅扫描表一次。因此,该版本应该更快。如果您的“表”确实是一个复杂的子查询,则性能差异可能很重要。

另一种方法是unpivot。 unpivot语法(尽管是标准的)仅处理一件事。 cross apply-实现标准的 lateral 连接-更加强大。取消透视只是使用语法的多种方式之一。而且,这是学习横向连接的简便方法。

答案 2 :(得分:0)

这听起来像是Pivot / UnPivot的工作...

create table #testing (id int, var1 int, var2 int, var3 int)
insert into #testing values (1,4,3,9);
insert into #testing values (2,5,2,8);
insert into #testing values (3,1,6,2);

select x.id, x.vars, x.val 
from #testing d
unpivot (val for vars in (var1, var2, var3)) as x

enter image description here

enter image description here