如果源行为空,则将表数据从一行移动到另一行

时间:2017-03-07 12:43:07

标签: sql sql-server-2008-r2

我有表,有些列包含空值,我的任务是将所有NULL值移到左侧,因此数值以相同的顺序从右向左移动。

(前)

Column1   Column2    Column3    Column4
--------------------------------------------
NULL      1          NULL       3
1         NULL       3          2
1         2          3          NULL

输出应为

Column1   Column2    Column3    Column4
--------------------------------------------
1         3          NULL       NULL
1         3          2          NULL
1         2          3          NULL

1 个答案:

答案 0 :(得分:1)

这很痛苦,但您可以使用outer apply

来完成
select t.id, v.*
from t outer apply
     (select max(case when i = 1 then colval end) as col1,
             max(case when i = 2 then colval end) as col2,
             max(case when i = 3 then colval end) as col3,
             max(case when i = 4 then colval end) as col4
      from (select row_number() over (order by colnum) as i, v.*
            from (values (1, t.col1), (2, t.col2), (3, t.col3), (4, t.col4)
                 ) v(colnum, colval)
            where colval is not null
           ) v
     ) v;

我应该注意到,进行此类转换的必要性表明您的数据模型较差。单独列中的值应该位于另一个表中,每个id和每列有一行。