有没有什么方法可以动态地将行转换为列而无需 firebird 中的特定列数

is there any way to pivot rows to columns dynamically without a specific no of columns in firebird

我需要一种使用 sql 动态显示从行到列的数据的方法。我的排号从 0 到 N 开始,我想将其转换为列。我不能使用静态列来满足我的要求,因为最大行数每次都会根据公司要求的政策而变化。我已经完成研究,但 firebird 没有 pivot/transpose/cross-tab 实现(我可能是错的)。这是我的 tables

这是我的客户tables

这是我的应付款 table

我需要这样显示,因为涉及的客户很多

如您所见,我的客户可以支付 0 到 N 笔款项。

有没有办法使用 firebird 来实现它sql?

您无法在 Firebird 中使用 SQL 创建动态数据透视表。您可以使用 CASE WHEN 或 - 在 Firebird 4 中 - 使用 FILTER 子句实现固定枢轴,但动态枢轴是不可能的。

您将需要动态生成必要的查询,或者查询数据并在前端进行转换。

我们在使用 Firebird 的环境中遇到过这种情况。 Mark 是正确的,您不能执行动态数据透视,但在我们的场景中需要该功能。我们实现的是让我们的前端调用 Firebird 中的存储过程,它将“构建”固定枢轴的 SQL,然后是 return SQL,然后前端会然后执行SQL。 对于用户来说,它看起来像一个动态的 SQL.

在您的特定情况下,常规 sql 就足够了。

如果你从前端执行它,这将 return 你一个 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

上面的查询将 return 这个结果(我设置了格式以使其更具可读性)。

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 它应该可以正常工作。这将针对每种不同的贷款类型动态扩展。