根据某些列值将多个列值向右移动

时间:2016-08-18 03:18:35

标签: sql sql-server database sql-server-2008

我有一个临时表,其列和值如下:

第一个例子

COL001  COL002  COL003  COL004  COL005  COL006  COL007  COL008  COL009  COL010
-------------------------------------------------------------------------------------------------
aa      bb      cc      dd       ee     *YY*    ff      gg      hh      ii

第二个例子:

COL001  COL002  COL003  COL004  COL005  COL006  COL007  COL008  COL009  COL010
-------------------------------------------------------------------------------------------------
aa      bb      *YY*    ff     gg       hh      ii      jj      kk      ll

应该看起来像:

COL001  COL002  COL003  COL004  COL005  COL006  COL007  COL008  COL009  COL010
-------------------------------------------------------------------------------------------------
aa      bb                              *YY*    ff      gg      hh      ii

正如您在第一个样本中看到的YY位于COL006

数据未在列中修复。

COL003COL004COL005为空时,YY将转移到COL003,所有剩余的列也将跟随。[第2个样本]

我想要做的就是将YY修改为COL006以及所有剩余的列,将COL003COL004COL005修改为NULL。

传入数据来自文本文件,并由其他团队管理的Windows脚本导入:

的Sample1

aa | bb | cc | dd | ee | YY | ff | gg | hh | ii ---->最多80列

样品2

aa | bb | YY | ff | gg | hh | ii | jj | kk | ll ---->最多80列

2 个答案:

答案 0 :(得分:0)

您可以使用SQLSplitString SQL split function从原始格式中分割数据,例如" aa | bb | cc | dd | ee | YY | ff | gg | hh | ii" 引用的split函数有一个参数,使程序员可以从列表中消除空值或空值,返回列表也有一个自动编号字段 最后,您将以表格格式

获得ColumnNumber,ColumnValue

以下是如何使用它

   --create table strList(id int, string nvarchar(max))
declare @str nvarchar(max) = 'aa|bb|cc||dd|ee||YY|ff|gg|hh|ii|'
insert into strList select 101,@str
set @str = 'aa|bb|YY|ff|gg|hh|ii|jj|kk|ll'
insert into strList select 102,@str

select 
    id, 
    MAX(col01) col01,
    MAX(col02) col02,
    MAX(col09) col09,
    MAX(col10) col10
from (
select 
    strList.id,
    case when s.id = 1 then val end as Col01,
    case when s.id = 2 then val end as Col02,
    case when s.id = 9 then val end as Col09,
    case when s.id = 10 then val end as Col10
from strList
cross apply dbo.SQLSplitString(string,'|',1,0) s
) t
group by id

enter image description here 我希望它有所帮助

答案 1 :(得分:0)

如果这种转变总是由一个特定的" YY"列col003col004col005中的一个值,结果是null值被注入,以便" YY"移动到第6列,然后您可以执行以下操作(简化为8列):

select col001, col002, col003, col004, col005, col006, col007, col008
from   mytable
where  "YY" not in (col003, col004, col005)
union all
select col001, col002, null,   col003, col004, col005, col006, col007
from   mytable
where  col005 = "YY"
union all
select col001, col002, null,   null,   col003, col004, col005, col006
from   mytable
where  col004 = "YY"
union all
select col001, col002, null,   null,   null,   col003, col004, col005
from   mytable
where  col003 = "YY"
order by col001

应调整order by(如果您需要某个订单)。 <{1}}构造不会保留原始顺序的记录 - 至少不能保证。