有没有什么方法可以动态地将行转换为列而无需 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 它应该可以正常工作。这将针对每种不同的贷款类型动态扩展。
我需要一种使用 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 它应该可以正常工作。这将针对每种不同的贷款类型动态扩展。