Преобразование данных путем усечения / удаления аналогичной информации из строк в SQL Server - PullRequest
0 голосов
/ 22 мая 2019

У меня есть исходные данные в таблице SQL Server, как показано ниже Source

, и их необходимо преобразовать согласно ниже Transformation

Пожалуйста, дайте мне знать, как этого можно достичь.

Вот код для создания таблицы и вставки данных примера.

CREATE TABLE dbo.tbl_TestData 
(Level1 NVARCHAR(25),Level2 NVARCHAR(25),Level3 NVARCHAR(25),Level4 
NVARCHAR(25),Level5 NVARCHAR(25),
Level6 NVARCHAR(25),Level7 NVARCHAR(25),Level8 NVARCHAR(25),Level9 
NVARCHAR(25)
)

INSERT INTO dbo.tbl_TestData 
(Level1,Level2,Level3,Level4,Level5,Level6,Level7,Level8,Level9)
VALUES ('Shared Services','Shared Services','Shared Services','Shared 
Services','Shared Services','Shared Service Functions','Finance','AFO 
Total','AFO BAU'),
('Shared Services','Shared Services','Shared Services','Shared 
Services','Shared Services','Shared Service Functions','IT','TOTAL 
IT','GLOBAL INFRASTRUCTURE'),
('UKI Total','UKI Total','Insurance Total','Manufacturing / 
Segments','Claims','Commercial SME','Regional Trading','Commercial 
SME','North Operations'),
('ACS OBSOLETE','ACS OBSOLETE','ACS OBSOLETE','ACS OBSOLETE','ACS 
OBSOLETE','ACS OBSOLETE','ACS OBSOLETE','ACS OBSOLETE','SP Central')

1 Ответ

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

Позвольте мне начать с того, что вы можете не означает, что вы должны .Эти данные не структурированы должным образом, как некоторые из комментариев состояния.

Первый шаг - un-pivot данных.Используя запрос ниже, вы можете увидеть, как это реорганизует данные.Обратите внимание, что если порядок строк имеет значение, то необходимо изменить предложение over функции row_number().

select
      upvt.RowNum
    , upvt.LevelNum
    , upvt.LevelValue
from
    (
        select
              row_number() over (order by [level1]) as RowNum
            , a.Level1, a.Level2, a.Level3
            , a.Level4, a.Level5, a.Level6
            , a.Level7, a.Level8, a.Level9
        from
            dbo.tbl_TestData as a
    ) as a
unpivot
    (
        LevelValue for LevelNum in (
              [Level1], [Level2], [Level3]
            , [Level4], [Level5], [Level6]
            , [Level7], [Level8], [Level9])
    ) as upvt

Используя неопорные данные, вы можете сгруппировать по значениям инайти минимальный уровень для каждого значения.Затем его можно переупорядочить и повернуть обратно к почти , чтобы получить желаемый результат.Обратите внимание, что порядок строк не одинаков, если это имеет значение.

select
    pvt.Level1
  , pvt.Level2
  , pvt.Level3
  , pvt.Level4
  , pvt.Level5
  , pvt.Level6
  , pvt.Level7
  , pvt.Level8
  , pvt.Level9
from
    (
        select
              a.RowNum
            , a.LevelValue
            , 'Level' + cast(row_number() over (partition by a.RowNum order by min(a.LevelNum)) as char(1)) as NewLevelNum
        from
            (
                select
                      upvt.RowNum
                    , upvt.LevelNum
                    , upvt.LevelValue
                from
                    (
                        select
                              row_number() over (order by [level1]) as RowNum
                            , a.Level1, a.Level2, a.Level3
                            , a.Level4, a.Level5, a.Level6
                            , a.Level7, a.Level8, a.Level9
                        from
                            dbo.tbl_TestData as a
                    ) as a
                unpivot
                    (
                        LevelValue for LevelNum in (
                              [Level1], [Level2], [Level3]
                            , [Level4], [Level5], [Level6]
                            , [Level7], [Level8], [Level9])
                    ) as upvt
            ) as a
        group by
            a.RowNum, a.LevelValue
    ) as a
pivot
    (
    max(LevelValue)
    for NewLevelNum in (
          [Level1], [Level2], [Level3]
        , [Level4], [Level5], [Level6]
        , [Level7], [Level8], [Level9])
    ) as pvt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...