Следующий запрос даст вам максимальное количество различных цветов, чтобы вы могли создать обязательные поля:
select max(count(distinct color))
from MY_TABLE
group by CID;
Я бы добавил поле _rank в таблицу, чтобы было легче различитьзаписи:
alter table MY_TABLE add (_rank number(10));
update MY_TABLE set _rank = rank() over (partition over CID order by color);
alter table MY_TABLE add constraint ukx unique (CID, _rank);
, затем выполните следующий запрос для каждого поля color2, color3, color4 ....
update MY_TABLE x
set x.color2 =
(select y.color
from MY_TABLE y
where x.CID = y.CID
and y._rank = 2)
where x._rank = 1;
и наконец:
delete from MY_TABLE where _rank != 1;
alter table MY_TABLE drop (_rank);