Перенос данных из одного столбца в другой - PullRequest
0 голосов
/ 16 мая 2019

Меня попросили создать отчет, в котором рассматриваются данные из службы поддержки ИТ. Когда пользователь регистрирует заявку, он регистрирует ее под «Основным» или «Под» - это родительские категории. Что меня усложняет, так это то, что в этих родительских категориях есть дочерние категории с разным количеством уровней. Система была разработана очень плохо, поэтому нет никаких столбцов под названием «Основной» или «Sub» - просто группа столбцов для разных категорий. Ниже приведен пример

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

Каждый тикет всегда имеет менее 4 уровней в иерархии, а основная категория всегда является последним заполненным столбцом в строке (слева). Иногда все 4 столбца могут быть заполнены, а иногда это может быть 2. Что я хочу сделать, это создать некоторый код, который поместит основную категорию в столбец слева со всеми остальными категориями после нее.

Таким образом, вышеизложенное будет выглядеть следующим образом

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

Может ли кто-нибудь помочь с этим? Я пытался слиться без радости, и я не могу понять, как мне этого добиться!

Ценю любую помощь Jess

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Я думаю, что вы можете сделать это, определив основную категорию (используя 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);

Здесь - это дБ <> скрипка.

0 голосов
/ 16 мая 2019

Создайте новую таблицу с дополнительным столбцом или добавьте столбец к существующей таблице, а затем обновите новый столбец.

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') 
0 голосов
/ 16 мая 2019

Пока 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')
...