У меня есть таблица:
ID | КОД | ЗНАЧЕНИЕ |
---|---|---|
1 | A | 5 |
1 | B | 6 |
1 | C | 7 |
1 | C | 8 |
1 | C | 9 |
и я хочу получить следующее:
ID | A | B | C |
---|---|---|---|
1 | 5 | 6 | 7 |
1 | 5 | 6 | 8 |
1 | 5 | 6 | 9 |
Как это возможно?
Спасибо!
Я пробовал использовать сводные таблицы, но не хочу агрегировать ‘Код’. Есть ли решение для этого?
Ответ
Для преобразования таблиц в T-SQL с использованием оператора PIVOT, важно понимать, что данный оператор в основном предназначен для агрегации данных, что может затруднить его использование, если вы не хотите агрегации. В вашем случае вы хотите преобразовать строки с одинаковым ID и CODE в столбцы, не aggregiting их. Чтобы добиться этого, можно использовать временные таблицы или CTE (Common Table Expressions).
Вот метод, который поможет вам достичь желаемого результата, используя CTE и PIVOT. Предположим, что у вас исходная таблица называется YourTable
.
Шаги:
-
Создайте временную CTE с нумерацией строк: Для начала создайте CTE, в которой вы будете нумеровать строки для каждого уникального CODE, чтобы можно было использовать эти номера для создания столбцов.
- Используйте оператор PIVOT для преобразования данных.
Вот полный пример кода:
-- Создайте временную таблицу для примера
CREATE TABLE YourTable (
ID INT,
CODE CHAR(1),
VALUE INT
);
-- Вставьте данные в таблицу
INSERT INTO YourTable (ID, CODE, VALUE) VALUES
(1, 'A', 5),
(1, 'B', 6),
(1, 'C', 7),
(1, 'C', 8),
(1, 'C', 9);
-- Используем CTE для создания уникальной нумерации для CODE
WITH NumberedValues AS (
SELECT
ID,
CODE,
VALUE,
ROW_NUMBER() OVER (PARTITION BY ID, CODE ORDER BY (SELECT NULL)) AS RN
FROM YourTable
)
SELECT
ID,
[A],
[B],
[C]
FROM
NumberedValues
PIVOT
(
MAX(VALUE) FOR CODE IN ([A], [B], [C])
) AS PivotTable
ORDER BY ID, RN;
Объяснение:
-
CTE (Common Table Expression): CTE
NumberedValues
создает набор данных, где каждая строка имеет уникальный номер, который позволяет вам различать строки с одинаковыми значениями CODE. - Оператор PIVOT: Поворот (PIVOT) использует
MAX(VALUE)
для преобразования значений CODE в столбцы (A, B, C). Мы используемROW_NUMBER()
для создания уникальных записей для каждой комбинации ID и CODE.
Таким образом, вы сможете получить желаемый формат таблицы, где ID будет дублироваться, а значения CODE будут представлены в качестве отдельных столбцов.
Вывод:
Этот метод позволяет преобразовать вашу исходную таблицу в нужный формат без необходимости объединять значения. Запустите приведенный выше код в вашей базе данных SQL Server, и он должен вернуть ожидаемый результат.