Я думаю, что поворот данных - это лучший формат, и вы сможете легко делать то, что хотите. Первый поворот:
select parentid,
max(case when okeyname = 'name' then okeydata end) as name,
max(case when okeyname = 'number' then okeydata end) as number,
max(case when okeyname = 'yes_no' then okeydata end) as name
from [elo].[dbo].[objkeys]
group by parentid ;
Затем, чтобы получить первую парентиду, используйте подзапрос:
select min(parentid) as parentid, name, number, yes_no
from (select parentid,
max(case when okeyname = 'name' then okeydata end) as name,
max(case when okeyname = 'number' then okeydata end) as number,
max(case when okeyname = 'yes_no' then okeydata end) as yes_no
from [elo].[dbo].[objkeys]
group by parentid
) p
group by name, number, yes_no;
А если вам нужен оригинальный формат, то снимите кружок:
select nny.parentid, v.*
from (select min(parentid) as parentid, name, number, yes_no
from (select parentid,
max(case when okeyname = 'name' then okeydata end) as name,
max(case when okeyname = 'number' then okeydata end) as number,
max(case when okeyname = 'yes_no' then okeydata end) as yes_no
from [elo].[dbo].[objkeys]
group by parentid
) p
group by name, number, yes_no
) nny cross apply
(values ('name', name),
('number', number),
('yes_no', yes_no)
) v(okeyname, okeydata)