Попробуйте это:
;WITH Data AS
(
SELECT
V.ID,
V.Code,
DenseRankByID = DENSE_RANK() OVER (ORDER BY V.ID),
RowNumber = ROW_NUMBER() OVER (ORDER BY V.ID ASC, V.Code ASC)
FROM
(VALUES
(1, 'A'),
(1, 'B'),
(2, 'C'),
(2, 'D'),
(3, 'E'),
(3, 'F')) AS V(ID, Code)
),
AddedValues AS
(
SELECT DISTINCT
[Value] = CONVERT(VARCHAR(100), D.ID),
D.DenseRankByID,
RowNumber = 0
FROM
Data AS D
UNION ALL
SELECT
[Value] = D.Code,
D.DenseRankByID,
D.RowNumber
FROM
Data AS D
)
SELECT
A.[Value],
A.DenseRankByID,
A.RowNumber
FROM
AddedValues AS A
ORDER BY
A.DenseRankByID,
A.RowNumber
Результат:
Value DenseRankByID RowNumber
1 1 0
A 1 1
B 1 2
2 2 0
C 2 3
D 2 4
3 3 0
E 3 5
F 3 6
Вы можете опустить последние 2 столбца на SELECT
, если не хотите, чтобы они отображались (неt удалите их из ORDER BY
, хотя).
Плотный ранг используется, чтобы дать различное число для каждого значения из 1-го столбца, в то время как номер строки просто отличает все другие значения от 2-гоколонка.Затем мы получаем все различные значения из 1-го столбца (первая часть UNION ALL
) и добавляем их ко всем остальным значениям из 2-го столбца.