По сути, вам нужно отменить вывод данных по тестам:
id | test | result
+----------+----------+----------+
12345 | test1 | P
12345 | test2 | P
12345 | test3 | F
12345 | test4 | I
12345 | test5 | P
...
- чтобы вы могли затем сгруппировать их по результатам теста.
К сожалению, PostgreSQL не имеет встроенной функциональности Pivot / Unpivot, поэтому простейшим способом сделать это будет что-то вроде:
select id, 'test1' test, test1 result from mytable union all
select id, 'test2' test, test2 result from mytable union all
select id, 'test3' test, test3 result from mytable union all
select id, 'test4' test, test4 result from mytable union all
select id, 'test5' test, test5 result from mytable union all
...
Есть и другие способы обращенияэто, но с 40 столбцами данных это будет действительно ужасно.
РЕДАКТИРОВАТЬ: альтернативный подход -
select r.result, sum(char_length(replace(replace(test1||test2||test3||test4||test5,excl1,''),excl2,'')))
from mytable m,
(select 'P' result, 'F' excl1, 'I' excl2 union all
select 'F' result, 'P' excl1, 'I' excl2 union all
select 'I' result, 'F' excl1, 'P' excl2) r
group by r.result