Есть ли способ динамического поворота строк в столбцы без определенного количества столбцов в Firebird - PullRequest
0 голосов
/ 01 апреля 2019

Мне нужен способ динамического отображения моих данных из строк в столбцы с помощью sql. Мой ряд № начинается с 0 до N, и я хочу преобразовать его в столбцы. Я не могу использовать статический столбец, чтобы соответствовать моему требованию, потому что максимальное количество строк изменяется каждый раз в зависимости от политики, требуемой компанией. Я провел исследование, но Firebird не имеет реализации pivot / transpose / cross-tab (я могу ошибаться). Вот мои столы

вот мои клиентские столы

enter image description here

вот моя таблица выплат

enter image description here

Мне нужно отобразить как это, так как многие клиенты включают

enter image description here

Как вы можете заметить, у моего клиента может быть от 0 до N.

Есть ли способ реализовать это с помощью firebird sql?

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Мы столкнулись с этой ситуацией в нашей среде с 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, он должен работать так, как вы хотите. Это будет динамически расширяться для каждого отдельного типа кредита.

0 голосов
/ 01 апреля 2019

Вы не можете создать динамический свод, используя SQL в Firebird. Вы можете добиться фиксированного поворота с помощью CASE WHEN или - в Firebird 4 - с помощью предложения FILTER, но динамические опоры не возможны.

Вам нужно будет динамически сгенерировать необходимый запрос или запросить данные и преобразовать их в ваш интерфейс.

...