Это называется поворот таблицы. Вам нужно знать количество столбцов в наборе результатов.
Учитывая вашу таблицу спецификаций, будет работать следующее:
select tax_name1 = t1.tax_name , tax_amount1 = t1.tax_amount ,
tax_name2 = t2.tax_name , tax_amount2 = t2.tax_amount ,
tax_name3 = t3.tax_name , tax_amount3 = t3.tax_amount ,
tax_name4 = t4.tax_name , tax_amount4 = t4.tax_amount
from foo t1
full join foo t2 on t2.tax_name = 'TAX_B'
full join foo t3 on t3.tax_name = 'TAX_C'
full join foo t4 on t4.tax_name = 'TAX_D'
where t1.tax_name = 'TAX_A'
В более "реальном мире" сценарий первой таблицей должен был бы выбрать отдельный набор идентификаторов для строк, которые вы хотите в наборе результатов, а затем выполнить левое самостоятельное объединение для каждой "итерации", что-то вроде:
select t.id ,
tax_name1 = t1.tax_name , tax_amount1 = t1.tax_amount ,
tax_name2 = t2.tax_name , tax_amount2 = t2.tax_amount ,
tax_name3 = t3.tax_name , tax_amount3 = t3.tax_amount ,
tax_name4 = t4.tax_name , tax_amount4 = t4.tax_amount
from (select distinct id from foo ) t
left join foo t1 on t1.id = t.id and t1.tax_name = 'TAX_A'
left join foo t2 on t2.id = t.id and t2.tax_name = 'TAX_B'
left join foo t3 on t3.id = t.id and t3.tax_name = 'TAX_C'
left join foo t4 on t4.id = t.id and t4.tax_name = 'TAX_D'
ура!