如何获取平均值而忽略字段的某些值

阿波罗·塞里奥拉(Apollo Ceriola)

我知道如何获取数字之间的平均值,但是当我尝试执行相同的方法(通过设置变量的属性)以从数字和字符串的混合值中获取平均值时,它总是会返回异常(并且我知道为什么)。

如何获取具有数字和字符串混合值的column_1的平均值

column_1
  3
  4
  N/A
  3
  N/A

意思是说,在第1列中,平均值必须为3.33.(3+4+3)/3应应用公式,N/A必须从计算中忽略/排除这两个值。怎么做?

亚历克斯·K

该任务可以分解为几个简单的子任务:

  1. 从混合类型获取数值。我们应该检查该字段的数值。
  2. 计算所有数值的平均值(跳过非数值)。

为了解决第一个子任务,我们可以使用Apache commons-lang库。StringUtils.isNumeric(java.lang.CharSequence中)的方法帮助我们检查,如果值是数字。

为了解决第二个子任务,我们可以使用两个变量-第一个变量用于存储数值,第二个变量用于计算平均值。

工作实例

数据源

我在此示例中使用了csv数据源:

numValue
3
4
N/A
3
N/A

在下面的示例中,此数据源的数据适配器的名称为str_num.csv文件的第一行被跳过-它包含列的名称。

报告的模板

我使用Jaspersoft Studio(JSS)来设计报告模板。明细”区域用于显示数据,“摘要”区域用于显示平均值。

具有值(数字和非数字)的字段将是java.lang.String类型。

第一个变量仅用于存储数字值。如果值是零,我们将使用null初始化变量

表达式将是:

StringUtils.isNumeric($F{numValue}) ? Integer.valueOf($F{numValue}) : null

表达式中使用的是Java库,这就是为什么我们需要将报表的语言设置为java并为StringUtils类添加import的原因

第二个变量将是“平均值”计算类型:

<variable name="averageValue" class="java.lang.Double" calculation="Average">
    <variableExpression><![CDATA[$V{number}]]></variableExpression>
    <initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>

完整的模板:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Average value" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="bee405b0-c35a-442a-841d-f51423c1c797">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="str_num.csv"/>
    <import value="org.apache.commons.lang3.StringUtils"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="numValue" class="java.lang.String"/>
    <variable name="number" class="java.lang.Integer">
        <variableExpression><![CDATA[StringUtils.isNumeric($F{numValue}) ? Integer.valueOf($F{numValue}) : null]]></variableExpression>
    </variable>
    <variable name="averageValue" class="java.lang.Double" calculation="Average">
        <variableExpression><![CDATA[$V{number}]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <detail>
        <band height="30" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="230" height="30" uuid="9d00d7e3-b9bc-404d-8842-728326a5d2df"/>
                <textFieldExpression><![CDATA["Original value: " + $F{numValue}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="230" y="0" width="250" height="30" uuid="4509cae9-3b89-4860-838a-36aa4466fb37"/>
                <textFieldExpression><![CDATA["Only numeric value: " + $V{number}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <summary>
        <band height="53">
            <staticText>
                <reportElement x="0" y="0" width="230" height="30" uuid="937af139-259c-49da-a0d9-191bcf801cca"/>
                <text><![CDATA[Average value (non numeric values are skipped):]]></text>
            </staticText>
            <textField pattern="0.00">
                <reportElement x="230" y="0" width="140" height="30" uuid="9abd786b-32ee-4ab1-91dc-851e8bfef0db"/>
                <textFieldExpression><![CDATA[$V{averageValue}]]></textFieldExpression>
            </textField>
        </band>
    </summary>
</jasperReport>

输出结果

JSS中生成的结果如下所示:

JSS中的结果。 3条记录的平均值

如果我们将第一个变量(用于存储数值)的表达式更改为此:

StringUtils.isNumeric($F{numValue}) ? Integer.valueOf($F{numValue}) : 0

结果将是:

JSS中的结果。 5条记录的平均值

-这是5条记录的平均值,而不是上面第一种情况的3条记录的平均值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MongoDB查找给定字段并获取平均值

来自分类Dev

从多个JSON对象值获取平均值

来自分类Dev

SQL:使用空值获取平均值

来自分类Dev

对某些列取平均值

来自分类Dev

如何从R获取平均值图

来自分类Dev

Python,如何从 MySQL 的元组中获取平均值?

来自分类Dev

如何从Django中外键的值取平均值?

来自分类Dev

从数组中获取平均值

来自分类Dev

使用列表获取平均值

来自分类Dev

LINQ从IQueryable获取平均值

来自分类Dev

通过列表获取平均值

来自分类Dev

从EF获取平均值

来自分类Dev

从地图获取平均值条目

来自分类Dev

取平均值

来自分类Dev

无需填写所有字段且无需按钮即可获取平均值

来自分类Dev

嗨,尝试使用awk从数组值中获取平均值吗?

来自分类Dev

当存在NaN值时在熊猫数据框中获取平均值

来自分类Dev

以 1 分钟为间隔获取平均值和最大值 T-SQL

来自分类Dev

如果键列值与 dplyr (R) 重复,则获取平均值

来自分类Dev

如何在VBA上按单元格内容获取平均值

来自分类Dev

R如何删除列中的重复元素并获取平均值

来自分类Dev

如何将varchar转换为int以获取平均值?

来自分类Dev

如何从MySQL中其他2个表起源的表中获取平均值?

来自分类Dev

如何直接从 R 中的 csv 行范围获取平均值?

来自分类Dev

查找某些字段的平均值

来自分类Dev

从表中的“最后” N行获取平均值

来自分类Dev

Ruby合并哈希列表并获取平均值

来自分类Dev

Python:从多个文件的多个列获取平均值

来自分类Dev

从NSManagedObject请求数组获取平均值