我需要一种使用sql从行到列动态显示数据的方法。我的行号从0到N开始,我想将其转换为列。我不能使用静态列来满足我的要求,因为最大行数每次都根据公司要求的策略而变化。我已经完成研究,但是firebird没有数据透视/转置/交叉表实现(我可能是错的)。这是我的桌子
这是我的客户桌
这是我的应付表
我需要这样显示,因为有很多客户参与
如您所见,我的客户可以支付0到N。
有没有办法使用firebird sql来实现它?
答案 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
子句来实现固定枢轴,但是动态枢轴是不可能的。
您将需要动态生成必要的查询,或者查询数据并在前端对其进行转换。