Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pivot 在firebird中是否有任何方法可以在没有特定列数的情况下动态地将行转为列_Pivot_Firebird_Firebird2.5_Firebird 3.0 - Fatal编程技术网

Pivot 在firebird中是否有任何方法可以在没有特定列数的情况下动态地将行转为列

Pivot 在firebird中是否有任何方法可以在没有特定列数的情况下动态地将行转为列,pivot,firebird,firebird2.5,firebird-3.0,Pivot,Firebird,Firebird2.5,Firebird 3.0,我需要一种使用sql从行到列动态显示数据的方法。我的行号从0到N开始,我想将其转换为列。我无法使用静态列来匹配我的要求,因为最大行数每次都会根据公司要求的策略而变化。我做过研究,但firebird没有pivot/transpose/cross-tab实现,我可能错了。这是我的桌子 这是我的客户表 这是我的桌子 我需要这样展示,因为有很多客户参与 正如您所注意到的,我的客户可能有0到N的应付款 有没有办法使用firebird sql实现它?在firebird中不能使用sql创建动态轴心。您可以使用

我需要一种使用sql从行到列动态显示数据的方法。我的行号从0到N开始,我想将其转换为列。我无法使用静态列来匹配我的要求,因为最大行数每次都会根据公司要求的策略而变化。我做过研究,但firebird没有pivot/transpose/cross-tab实现,我可能错了。这是我的桌子

这是我的客户表

这是我的桌子

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

正如您所注意到的,我的客户可能有0到N的应付款


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

在firebird中不能使用sql创建动态轴心。您可以使用CASE-WHEN实现固定枢轴,或在Firebird 4中使用FILTER子句实现固定枢轴,但动态枢轴是不可能的


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

我们在Firebird的环境中遇到过这种情况。Mark是正确的,您不能使用dynamic pivot,但在我们的场景中需要该功能。我们实现的是前端调用Firebird中的存储过程,该存储过程将为固定数据透视构建SQL,然后返回SQL,然后前端将执行SQL。 对于用户来说,它看起来像一个动态SQL

在您的特定情况下,常规sql就足够了

如果从前端执行此操作,将返回一条SQL语句

以cte为例 选择不同的loantype, “SUMCASE loantype WHEN”| | loantype | | | |然后loanamt”| | | | |否则0 END”CASE|STMT来自tblpayables 选择“选择m.MEMBERID,” ||演员名单cte.case|U stmt|replaceloantype',如varchar3000 ||'从tblmembers m内部加入tblpayables p on m.MEMBERID=p.MEMBERID按m.MEMBERID分组' 来自cte 上面的查询将返回我格式化的结果,因此更具可读性

选择m.MEMBERID, SUMCASE loantype当“贷款类型1”时,然后loanamt ELSE 0结束loantype1, SUMCASE loantype当“贷款类型2”时,然后loanamt ELSE 0结束loantype2, SUMCASE loantype当“贷款类型3”时,然后loanamt ELSE 0结束loantype3, SUMCASE loantype当“贷款类型4”时,然后loanamt ELSE 0结束loantype4 来自TBL成员m 内部联接tblpayables p on m.MEMBERID=p.MEMBERID 按m.MEMBERID分组
我不得不删除列标签中的空格,因为Firebird不喜欢标签中的空格。但是,如果执行SQL,它应该可以按照您的需要工作。这将为每个不同的贷款类型动态扩展。

没有特定的列数-不,这是不可能的。在查询实际运行之前,数据库引擎必须知道查询的列数,但在运行时无法确定。这是SQL查询语言的一个限制,并非特定于Firebird,对所有关系数据库都是如此。您是说不可能使用最初可以查询的行数来设置列数?因为我想的是获取行,然后将其实例化为列。我只是不知道如何使用过程来实现它?您需要某种动态SQL,首先确定需要多少列,然后使用这些列和正确的SQL表达式构建一个SQL查询,然后运行生成的查询。在大多数情况下,在将数据检索为行之后,最好在前端执行这种转换。SQL根本不是设计用来做这件事的。好吧。至少我可以开始考虑如何使用前端实现它。我只是认为使用过程是可能的。@Mandz过程有固定数量的输出列,具有固定的名称,所以存储过程也不能这样做。好的,至少我必须以不同的方式解决这个问题。我只需要使用假设设置最大列。为什么前端本身不能生成SQL?@Arioch'问题是,是否有办法在firebird SQL中实现这一点。但是,如果派生动态SQL的逻辑是最小的,那么请确保它可以在前端完成。但根据我个人的经验,前端开发人员对数据库的域逻辑并不十分熟悉,当我们需要进行动态数据透视时,这不仅仅是一个表的转换,还包括熟悉数据库域以遍历不同的表。@Arioch'Ed Mendez是正确的。在我们目前的工作分配中,我的同事前端开发人员甚至不了解数据库端系统实现的逻辑。这就是为什么我要在数据库sql端完成所有计算,这样他唯一要做的就是显示这些数据。@EdMe
也许你是对的,因为我一直在疯狂地寻找。尝试我能想到的任何程序都没有运气。也许我会通过前端来实现旋转。在选择答案之前,我会再等一段时间,这样我们就可以对如何解决这个问题有更多的想法。thxmake三层系统,又称AppServer?但当然,仅仅一个查询就显得有些过分了