Мы столкнулись с этой ситуацией в нашей среде с Firebird. Марк верен, вы не можете сделать динамический разворот, но в нашем сценарии нужна эта функциональность. Мы реализовали для нашего внешнего интерфейса вызов хранимой процедуры в Firebird, которая «создаст» SQL для фиксированной точки, а затем вернет SQL, а затем внешний интерфейс выполнит SQL.
Для пользователя это будет выглядеть как динамический SQL.
В вашем конкретном случае должно хватить обычного sql.
если вы выполните это из внешнего интерфейса, это вернет вам оператор SQL.
with cte as (
Select DISTINCT loantype,
'SUM(CASE loantype WHEN ''' || loantype || ''' then loanamt' || ' ELSE 0 END) ' CASE_STMT from tblpayables
)
Select 'Select m.MEMBERID ,'
|| cast( List( cte.case_stmt || replace(loantype,' ','')) as varchar(3000))
||' from tblmembers m inner join tblpayables p on m.MEMBERID = p.MEMBERID group by m.MEMBERID'
from cte
запрос выше вернет этот результат (я отформатировал, чтобы он был более читабельным).
Select m.MEMBERID ,
SUM(CASE loantype WHEN 'loan type 1' then loanamt ELSE 0 END) loantype1,
SUM(CASE loantype WHEN 'loan type 2' then loanamt ELSE 0 END) loantype2,
SUM(CASE loantype WHEN 'loan type 3' then loanamt ELSE 0 END) loantype3,
SUM(CASE loantype WHEN 'loan type 4' then loanamt ELSE 0 END) loantype4
from tblmembers m
inner join tblpayables p on m.MEMBERID = p.MEMBERID
group by m.MEMBERID
Мне пришлось удалить пробелы внутри меток столбцов, потому что Firebird не нравились пробелы в метках. Но если вы затем выполните SQL, он должен работать так, как вы хотите. Это будет динамически расширяться для каждого отдельного типа кредита.