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

У меня есть исходные данные в таблице 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')

Пожалуйста, не публикуйте изображения данных, это бесполезно для волонтеров, у которых вы просите помощи. Публикуйте данные в отформатированном виде text или в виде операторов DDL и DML. Каков ваш вопрос здесь, поскольку «дайте мне знать, как» не очень конкретно: использование оператора SQL было бы совершенно правильным ответом на этот вопрос. Вместо этого показывает нам ваши попытки, объясняет вашу цель и говорит нам, почему ваши попытки не сработали. Stack Overflow не является бесплатной службой кодирования, поэтому, пожалуйста, не относитесь к ней как к таковой. Спасибо.

Larnu 22.05.2019 13:58

Что-то не так со структурой этой таблицы, если вы пытаетесь сгруппировать данные по столбцам.

Jacob H 22.05.2019 13:58

Привет @Larnu, спасибо, я добавлю создание и вставку скриптов

Babulal 22.05.2019 14:03

@Babulal, как эти данные были сгенерированы в первую очередь? Вероятно, много легче изменить этот оператор, чем пытаться изменить результаты. Например, первый снимок экрана выглядит как результаты GROUP BY. WITH ROLLUP будет создавать строки промежуточных итогов, столбцы которых будут выглядеть так же, как на втором снимке экрана.

Panagiotis Kanavos 22.05.2019 14:06

@Babulal, работающий с Результат, с другой стороны, потребует UNPIVOT, чтобы получить значения в виде строк, а затем еще одну GROUP BY WITH ROLLUP, чтобы создать то, что вы могли бы получить из исходного запроса.

Panagiotis Kanavos 22.05.2019 14:07

Привет, @PanagiotisKanavos, эти данные получены в указанном формате. Не могли бы вы помочь мне с функцией WITH ROLLUP?

Babulal 22.05.2019 14:08

Можете ли вы опубликовать свои попытки, пожалуйста, вместе с другими подробностями, которые я просил, пожалуйста?

Larnu 22.05.2019 14:29

Привет @Larnu, я уже добавил операторы SQL, и я работаю над результатом. Могу ли я получить ваш вклад в эту проблему?

Babulal 22.05.2019 14:56

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

Larnu 22.05.2019 14:59
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
9
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Первым шагом является развернуть данных. Используя приведенный ниже запрос, вы можете увидеть, что это реорганизует данные. Обратите внимание: если порядок строк имеет значение, то условие 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

Другие вопросы по теме