我需要一种使用 sql 动态显示从行到列的数据的方法。我的行号 从 0 到 N 开始,我想将其转换为列。我不能使用静态列来满足我的要求,因为每次的最大行数都会根据公司要求的政策而变化。我已经完成了研究,但 firebird 没有枢轴/转置/交叉表实现(我可能错了)。这是我的桌子
这是我的客户表
这是我的应付表
我需要这样显示,因为有很多客户涉及
如您所见,我的客户可以有 0 到 N 的应付款项。
有没有办法使用firebird sql来实现它?
我需要一种使用 sql 动态显示从行到列的数据的方法。我的行号 从 0 到 N 开始,我想将其转换为列。我不能使用静态列来满足我的要求,因为每次的最大行数都会根据公司要求的政策而变化。我已经完成了研究,但 firebird 没有枢轴/转置/交叉表实现(我可能错了)。这是我的桌子
这是我的客户表
这是我的应付表
我需要这样显示,因为有很多客户涉及
如您所见,我的客户可以有 0 到 N 的应付款项。
有没有办法使用firebird sql来实现它?
我们在使用 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,它应该可以按您的意愿工作。这将针对每种不同的贷款类型动态扩展。
您无法在 Firebird 中使用 SQL 创建动态数据透视。CASE WHEN
您可以使用, 或 - 在 Firebird 4 中 - 使用子句实现固定枢轴FILTER
,但动态枢轴是不可能的。
您将需要动态生成必要的查询,或查询数据并在前端对其进行转换。