【问题标题】:Shift multiple column values to the right depending on some column value根据某些列值将多个列值向右移动
【发布时间】:2016-08-18 03:18:35
【问题描述】:

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

第一个例子

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

正如您在第一个示例中看到的那样,YYCOL006 中。

列中的数据不固定。

COL003COL004COL005 为空时,YY 将转移到COL003,并且所有剩余的列也将跟随。[第二个示例]

我想要做的就是将YY 修复为COL006 和所有剩余的列,并将COL003COL004COL005 设为NULL。

传入数据来自文本文件并由其他团队管理的 windows-scripts 导入:

样本1

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

样本2

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

【问题讨论】:

  • 第一行是标题还是实际输出?
  • 它是一个列标题。
  • 为什么不规范化这些数据呢?比你根本不会问这个问题。
  • 我们刚刚收到这些信息。来自他们的数据不是固定的。
  • @sccydd,由于您丢失了列值和列名之间的映射,因此无法解决。您可以通过计算“|”找到失败的次数并与预期的列数进行比较

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


【解决方案1】:

您可以使用 SQLSplitString SQL split function 将数据从其原始格式拆分,例如“aa|bb|cc|dd|ee|YY|ff|gg|hh|ii” 引用的拆分函数有一个参数,使程序员能够从列表中消除空值或空值,并且返回的列表也有一个自动编号字段 所以最后你会有表格格式的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

希望对你有帮助

【讨论】:

  • 谢谢,试试这个。
【解决方案2】:

如果此转变总是由 col003col004col005 列之一中的一个特定“YY”值触发,结果是注入 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 应该被调整(如果你需要一定的顺序)。 union all 构造不会按原始顺序保存记录——至少不能保证。

【讨论】:

  • 谢谢,会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2022-11-22
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多