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