将数据从一列转移到另一列

时间:2019-05-16 13:53:02

标签: sql sql-server-2016

已要求我构建一个报告,以查看来自IT服务台的数据。用户记录故障单时,他们将其记录在“主要”或“子”下-这些是父类别。对我而言,使事情变得复杂的是,这些父类别具有不同级别的子类别。该系统的设计很差,因此没有称为“主”或“子”的任何列-只是一堆用于不同类别的列。下面是一个示例

ID       Cat1     Cat2      Cat3    Cat4
22       MV       Main       NULL    NULL
23       Backup   Sec        Test    Main
25       AV       SUB2       SUB     NULL

每张票证在层次结构中始终少于4个级别,并且主要类别始终是行中最后一个填充的列(左侧)。有时可以填充所有4列,有时可以填充2。我想做的是创建一些代码,将Main Category放在左侧的一列中,所有其他类别都紧随其后。

因此,上面的内容将类似于以下内容

ID       MainCategory        Cat1      Cat2      Cat3
22       Main                MV         NULL      NULL
23       Main                Test       Sec       Backup
25       SUB                 SUB2       AV      NULL

有人可以帮忙吗?我没有喜悦地尝试了合并,但我无法真正掌握实现该目标的方法!

感谢任何帮助 杰西

3 个答案:

答案 0 :(得分:2)

我认为您可以这样确定:确定主要类别(使用coalesce()),然后使用nullif()null在其他列中删除该值:

select t.id, v.maincat,
       nullif(t.cat1, v.maincat) as cat1,
       nullif(t.cat2, v.maincat) as cat2,
       nullif(t.cat3, v.maincat) as cat3
from t cross apply
     (values (coalesce(t.cat4, t.cat3, t.cat2, t.cat1)) v(maincat);

Here是db <>小提琴。

答案 1 :(得分:0)

只要Main / SUB每行仅存在一次

select ID, Cat1 as MainCategory, Cat2 as Cat1, Cat3 as Cat2, Cat4 as Cat3
from tablename where Cat1 in ('Main', 'SUB')
UNION ALL
select ID, Cat2, Cat1, Cat3, Cat4
from tablename where Cat2 in ('Main', 'SUB')
UNION ALL
select ID, Cat3, Cat1, Cat2, Cat4
from tablename where Cat3 in ('Main', 'SUB')
UNION ALL
select ID, Cat4, Cat1, Cat2, Cat3
from tablename where Cat4 in ('Main', 'SUB')

-- To include rows without both Main and SUB, add

UNION ALL
select ID, Cat1, Cat2, Cat3, Cat4
from tablename
where Cat1 not in ('Main', 'SUB')
  and Cat2 not in ('Main', 'SUB')
  and Cat3 not in ('Main', 'SUB')
  and Cat4 not in ('Main', 'SUB')

答案 2 :(得分:0)

使用其他列创建新表,或将列添加到现有表中,然后更新新列。

UPDATE #NewTable
SET main = 'Main'
where cat1 = 'Main' or cat2 = 'Main' or cat3 = 'Main' or cat4 = 'Main'

UPDATE #NewTable
SET main = 'Sub' 
where cat1 = 'SUB' or cat2 = 'SUB' or cat3 = 'SUB' or cat4 = 'SUB'

UPDATE #NewTable
SET cat1 = null
where cat1 in ('Main', 'SUB') 

UPDATE #NewTable
SET cat2 = null
where cat2 in ('Main', 'SUB') 

UPDATE #NewTable
SET cat3 = null
where cat3 in ('Main', 'SUB') 

UPDATE #NewTable
SET cat4 = null
where cat4 in ('Main', 'SUB')