如果left包含null,right包含value,则将单元格在sql中向左移动

Ram*_*esh 1 sql sql-server-2008-r2

在Sql中,我得到如下格式的结果。总共我有6列。第1行第6列中包含该值,第二行第5和第6行中包含该值。但是我需要检查每个单元格,如果上一列不包含该值,则意味着我需要在第一列中使用它。

实际结果

         a          b           c       d          e    f
                                                        1
                                                   1    2
                                        1          2    3
Run Code Online (Sandbox Code Playgroud)

预期结果:-

      a          b           c       d          e    f
      1                                             
      1          2                                        
      1          2           3                        
Run Code Online (Sandbox Code Playgroud)

请张贴一些好的答案(我正在使用SQL Server 2008-R2)

ype*_*eᵀᴹ 5

另一种方式,类似于@Astander的方式(但使用OUTER APPLY代替PIVOT / UNPIVOT):

SELECT
    a = MIN(CASE WHEN y.rn = 1 THEN y.val END),
    b = MIN(CASE WHEN y.rn = 2 THEN y.val END),
    c = MIN(CASE WHEN y.rn = 3 THEN y.val END),
    d = MIN(CASE WHEN y.rn = 4 THEN y.val END),
    e = MIN(CASE WHEN y.rn = 5 THEN y.val END),
    f = MIN(CASE WHEN y.rn = 6 THEN y.val END)
FROM t
  OUTER APPLY
    ( SELECT
          x.val,
          rn = ROW_NUMBER() OVER (ORDER BY rn)
      FROM
      ( VALUES 
        (a,1), (b,2), (c,3), (d,4), (e,5), (f,6)
      ) x (val, rn) 
      WHERE x.val IS NOT NULL
    ) y 
GROUP BY 
    t.tid ;
Run Code Online (Sandbox Code Playgroud)

SQL-Fiddle中测试