有没有办法动态地将行旋转到列而无需在firebird中指定列数

时间:2019-04-01 06:27:21

标签: pivot firebird firebird2.5 firebird-3.0

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

这是我的客户桌

enter image description here

这是我的应付表

enter image description here

我需要这样显示,因为有很多客户参与

enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

我们在Firebird环境中遇到了这种情况。 Mark是正确的,您无法进行动态数据透视,但是在我们的方案中需要该功能。我们实现的目的是让前端调用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,则它应该可以按需要工作。这将针对每种不同的贷款类型动态扩展。

答案 1 :(得分:0)

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

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