Используя оператор case для разделения значений в сегменты, функция max позволит данным text_value перемещаться вверх.
select
item_id
,max(case metadata_field_id when 90 then text_value else null end) as volume_value
,max(case metadata_field_id when 91 then text_value else null end) as issue_value
from
metadatavalue
group by
item_id
Вот что я использовал для тестирования:
select
item_id
,max(case metadata_field_id when 90 then text_value else null end) as volume_value
,max(case metadata_field_id when 91 then text_value else null end) as issue_value
from
(
select 1 as item_id, 90 as metadata_field_id, '90-I am here' as text_value
union
select 1 as item_id, 91 as metadata_field_id, '91-Me too' as text_value
union
select 2 as item_id, 90 as metadata_field_id, null as text_value
union
select 2 as item_id, 91 as metadata_field_id, '91-funky' as text_value
union
select 3 as item_id, 90 as metadata_field_id, '90-fresh' as text_value
) metadatavalue
group by
item_id
Результаты:
item_id volume_value issue_value
1 90-I am here 91-Me too
2 NULL 91-funky
3 90-fresh NULL
Примечание. Я использовал SQL Server для моделирования и тестирования, а затем изменил синтаксис для соответствия Postgres.