首页 > 解决方案 > SQL Server根据列展开表

问题描述

我有一张这样的桌子:

Name      Sex    A      B      C

Alice     F      1      2      -
Bob       M      -      3      4
David     M      -      -      5

我需要根据从“A”到“C”的列键展开表(忽略空值),如下所示:

Name      Sex   Type   Value

Alice     F      A      1
Alice     F      B      2
Bob       M      B      3
Bob       M      C      4
David     M      C      5

我怎么能建立一个“存储过程”来完成这个

标签: sqlsql-serverdatabase

解决方案


您可以使用apply

select t.name, t.sex, v.type, v.value
from t cross apply
     (values ('A', t.A), ('B', t.B), ('C', t.C)) v(type, value)
where v.value is not null;

如果您需要“自动”完成此操作,请创建一个视图:

create view v_t as
    select t.name, t.sex, v.type, v.value
    from t cross apply
         (values ('A', t.A), ('B', t.B), ('C', t.C)) v(type, value)
    where v.value is not null;

不需要存储过程。


推荐阅读