Если у вас есть фиксированное количество типов сальдо и (user_id, month, balance_type) являются уникальными кортежами, то вы можете просто выполнить встроенный подзапрос для каждого типа сальдо. Например:
select user_id, month,
(select balance from balance_table bt where bt.user_id = user_id and bt.month = month and bt.balance_type = '1'),
(select balance from balance_table bt where bt.user_id = user_id and bt.month = month and bt.balance_type = '2') .....
from balance_table
Если возможно иметь несколько строк, имеющих одинаковые balance_type, month и user_id, то вы можете использовать команду pivot для сложения балансов для каждой группы, которая существует как в SQL Server, так и в Oracle (только для 11g). Скажем, например, у вас есть balance_types 1,2,3,4
select * from balance_table pivot (select sum(balance) for balance_type IN (1,2,3,4))
Если вы не знаете, сколько у вас предварительно сбалансированных типов, то я думаю, что динамически сгенерированный sql - единственный путь, и в этом случае вам следует использовать, например, пакет Oracle DBMS_SQL PL / SQL.