已要求我构建一个报告,以查看来自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
有人可以帮忙吗?我没有喜悦地尝试了合并,但我无法真正掌握实现该目标的方法!
感谢任何帮助 杰西
答案 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')