我有一个临时表,其列和值如下:
第一个例子
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
。
数据未在列中修复。
当COL003
,COL004
和COL005
为空时,YY
将转移到COL003
,所有剩余的列也将跟随。[第2个样本]
我想要做的就是将YY
修改为COL006
以及所有剩余的列,将COL003
,COL004
和COL005
修改为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列
答案 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
答案 1 :(得分:0)
如果这种转变总是由一个特定的" YY"列col003
,col004
或col005
中的一个值,结果是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}}构造不会保留原始顺序的记录 - 至少不能保证。