У меня есть исходные данные в таблице SQL Server, как показано ниже.
и необходимо преобразовать, как показано ниже
Пожалуйста, дайте мне знать, как этого можно достичь.
Вот код для создания таблицы и вставки демонстрационных данных.
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')
Что-то не так со структурой этой таблицы, если вы пытаетесь сгруппировать данные по столбцам.
Привет @Larnu, спасибо, я добавлю создание и вставку скриптов
@Babulal, как эти данные были сгенерированы в первую очередь? Вероятно, много легче изменить этот оператор, чем пытаться изменить результаты. Например, первый снимок экрана выглядит как результаты GROUP BY. WITH ROLLUP
будет создавать строки промежуточных итогов, столбцы которых будут выглядеть так же, как на втором снимке экрана.
@Babulal, работающий с Результат, с другой стороны, потребует UNPIVOT, чтобы получить значения в виде строк, а затем еще одну GROUP BY WITH ROLLUP, чтобы создать то, что вы могли бы получить из исходного запроса.
Привет, @PanagiotisKanavos, эти данные получены в указанном формате. Не могли бы вы помочь мне с функцией WITH ROLLUP?
Можете ли вы опубликовать свои попытки, пожалуйста, вместе с другими подробностями, которые я просил, пожалуйста?
Привет @Larnu, я уже добавил операторы SQL, и я работаю над результатом. Могу ли я получить ваш вклад в эту проблему?
Я буду рад помочь, но вам все равно нужно ответить на мой первоначальный комментарий, прежде чем я смогу это сделать.
Позвольте мне начать с того, что то, что вы могу, не означает, что вы должен. Эти данные не структурированы должным образом, как указано в нескольких комментариях.
Первым шагом является развернуть данных. Используя приведенный ниже запрос, вы можете увидеть, что это реорганизует данные. Обратите внимание: если порядок строк имеет значение, то условие 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
Пожалуйста, не публикуйте изображения данных, это бесполезно для волонтеров, у которых вы просите помощи. Публикуйте данные в отформатированном виде
text
или в виде операторов DDL и DML. Каков ваш вопрос здесь, поскольку «дайте мне знать, как» не очень конкретно: использование оператора SQL было бы совершенно правильным ответом на этот вопрос. Вместо этого показывает нам ваши попытки, объясняет вашу цель и говорит нам, почему ваши попытки не сработали. Stack Overflow не является бесплатной службой кодирования, поэтому, пожалуйста, не относитесь к ней как к таковой. Спасибо.