sql server - объединить данные двух столбцов в другой столбец, если в идентификаторе есть повторяющиеся значения - PullRequest
0 голосов
/ 18 декабря 2018

Моя таблица выглядит так:

Id  Message
1    A
1    B
2    C
2    D
3    E
3    F

Я хочу еще один столбец с объединением данных, как показано ниже

1
a
b
2
c
d
3
e
f

1 Ответ

0 голосов
/ 18 декабря 2018

Попробуйте это:

;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-го столбца.

...