Если коды относятся только к предоставленным, следующий запрос может предоставить желаемый результат.
select
pvt.Id,
codes.total As [Count],
COALESCE(C, 0) AS [#Code C],
COALESCE(I, 0) AS [#Code I],
COALESCE(D, 0) AS [#Code D]
from
( select Id, Code, Count(code) cnt
from t
Group by Id, Code) s
PIVOT(MAX(cnt) FOR Code IN ([C], [I], [D])) pvt
join (select Id, count(distinct Code) total from t group by Id) codes on pvt.Id = codes.Id ;
Примечание: как я могу видеть из примеров входных данных, код 'I' встречается во всех ид. Его счетчик равен нулю для Id = 3 в ожидаемом выходе (в вопросе).
Вот правильный результат:
DB Fiddle