如何将 birt 数据集列拆分为多行

Posted

技术标签:

【中文标题】如何将 birt 数据集列拆分为多行【英文标题】:How do I split birt dataset column into multiple rows 【发布时间】:2014-04-03 20:38:07 【问题描述】:

我的数据源有一列包含逗号分隔的数字列表。

我想创建一个数据集,将这些数字转化为分组以在条形图中使用。

要求

    数字将介于 0-17 之间 分组:0-2,3-5,6-10,11-17 x 轴标签必须是分组 y 轴是包含该分组的行的百分比 请注意,由于每行可以贡献多列,因此百分比加起来可以达到 > 100%

你能提供的任何帮助都会很棒......我对 BIRT 很陌生,现在已经坚持了几天

【问题讨论】:

【参考方案1】:

不确定我是否完全理解要求,但您的基本问题“将数据集列拆分为多行”可以使用脚本数据集或纯 SQL(取决于您的数据库)来解决。

无论哪种方式,您都需要第二个数据集(例如,您的数据模型是主从数据,在您的布局中,您需要类似

Table/List "主控绑定到主控 DS 表/列表“详细信息”绑定到详细信息 DS

明细 DS 需要来自主 DS 的逗号分隔结果列作为“String”类型的输入参数。

如果您了解 javascript 并且您了解脚本数据集的工作原理,使用脚本数据集执行此操作非常容易:创建一个默认值为 null 的对象类型的报表变量“myValues”和第二个类型的报表变量“myValuesIndex”整数,默认值为 0。

(注意:这都是未经测试的!)

将数据集“detail”创建为脚本 DS,其中一个输入参数“csv”为 String 类型,一个输出参数“value”为 String 类型。

在脚本DS的open事件中,代码:

  vars["myValues"] = this.getInputParameterValue("csv").split(",");
  vars["myValuesIndex"] = 0;

在fetch事件中,代码:

  var i = vars["myValuesIndex"];
  var len = vars["myValues"].length;
  if (i < len) 
    row["value"] = vars["myValues"][i];
    vars["myValuesIndex"] = i+1;
    return true;
   else 
    return false;
  

例如,对于 csv = "1,2,3-4,foo" 的主 DS 结果行,详细 DS 将产生 4 行 值 = "1" 值 = “2” 值 = “3-4” 值 = “富”

使用 Oracle 数据库,这可以在没有 Javascript 的情况下完成。细节 DS(具有与上面相同的输入参数)将如下所示:

  select t.value as value from table(split(?)) t

拆分函数的定义见RedFilter关于 Is there a function to split a string in PL/SQL?

如果你得到ORA-22813,你应该改变原来的定义

  create or replace type split_tbl as table of varchar2(32767);

  create or replace type split_tbl as table of varchar2(4000);

如https://community.oracle.com/thread/2288603?tstart=0中所述

11g 中的纯 SQL 也可以使用 regexp_substr(参见同一页)。

【讨论】:

我实际上已经有了与您的 javascript 解决方案非常相似的东西。我遇到的问题是它如何将我的实际数据集与脚本数据集连接起来?我在哪里将信息传递给该输入变量 抱歉再次通读。我知道连接是由带有子列表的列表完成的。我如何在条形图中使用它?【参考方案2】:

在脚本数据集中创建参数。在将脚本数据集分配给 Table 之后,我们必须通过 DataSet 参数绑定将实际数据集值传递或链接到脚本数据集参数。

【讨论】:

以上是关于如何将 birt 数据集列拆分为多行的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - 转换为数据集列的 UUID 引发解析异常

如何在火花中遍历数据集列?

将 pandas 中的一个单元格拆分为多行

将值替换为数据集列上的整数

BIRT 报表设计 - 设置辅助数据集的参数

从集合中随机替换 spark 数据集列值