Это может быть довольно простой PIVOT, использующий оконную функцию ROW_NUMBER()
. Я добавил 7-й CODE
для ID
1, чтобы показать, что он будет игнорироваться, если вы поворачиваете только 6 столбцов, потому что ваш OVER
не является детерминированным (он может ORDER
любым способом, каким пожелает поскольку он использует только ID
), он может получить другой набор из 6 CODE
с.
SQL Fiddle
Настройка схемы MS SQL Server 2017 :
CREATE TABLE t1 ( ID int, _CODE varchar(20) ) ;
INSERT INTO t1 (ID, _CODE)
VALUES
(1,'abc')
, (1,'xyz')
, (1,'def')
, (1,'pqr')
, (1,'jkl')
, (1,'tuv')
, (2,'lmn')
, (2,'rgb')
, (1,'ignoredOnly6')
;
Запрос 1 :
SELECT piv.ID
, piv.[1] AS CODE1
, piv.[2] AS CODE2
, piv.[3] AS CODE3
, piv.[4] AS CODE4
, piv.[5] AS CODE5
, piv.[6] AS CODE6
FROM (
SELECT t1.ID, t1._CODE
, ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY t1.ID) AS rn
FROM t1
) s1
PIVOT (
max(s1._CODE)
FOR s1.rn IN ([1],[2],[3],[4],[5],[6])
) piv
Результаты :
| ID | CODE1 | CODE2 | CODE3 | CODE4 | CODE5 | CODE6 |
|----|-------|-------|--------|--------|--------|--------|
| 1 | abc | xyz | def | pqr | jkl | tuv |
| 2 | lmn | rgb | (null) | (null) | (null) | (null) |