Поскольку идентификатор и ключ являются уникальной комбинацией для каждой таблицы, вы можете написать запрос следующим образом:
SELECT ta.str_val as A,
tb.str_val as B,
tc.date_val as C,
td.num_val as D,
te.str_val as E
FROM (SELECT DISTINCT id FROM test_table) ids
LEFT JOIN test_table ta ON ids.id = ta.id AND ta.key = 'A'
LEFT JOIN test_table tb ON ids.id = tb.id AND tb.key = 'B'
LEFT JOIN test_table tc ON ids.id = tc.id AND tc.key = 'C'
LEFT JOIN test_table td ON ids.id = td.id AND td.key = 'D'
LEFT JOIN test_table tc ON ids.id = te.id AND te.key = 'E';
В этом запросе вы получите все идентификаторы (если вы можете ответить на столбец «А», который всегда там, вы можете начать с этого). Затем вы должны присоединиться к каждому ключу для данного идентификатора.
Если вы не можете полагаться на тип данных ключа, т. Е. A может быть строкой или датой, то для каждого выбора необходимо использовать следующее:
COALESCE(ta.str_val,TO_CHAR(ta.date_val,'DD-MM-YYYY'),TO_CHAR(ta.num_val)) A,
COALESCE(tb.str_val,TO_CHAR(tb.date_val,'DD-MM-YYYY'),TO_CHAR(tb.num_val)) B,
...
etc.