0

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

这是我的客户表

在此处输入图像描述

这是我的应付表

在此处输入图像描述

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

在此处输入图像描述

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

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

4

2 回答 2

1

我们在使用 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,它应该可以按您的意愿工作。这将针对每种不同的贷款类型动态扩展。

于 2019-04-02T12:37:20.380 回答
0

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

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

于 2019-04-01T07:37:46.883 回答