如何计算iReport中变量的中位数?

时间:2016-07-19 20:04:37

标签: jasper-reports median

我正在iReport中准备报告,我需要计算将在交叉表中使用的变量的字段的中位数。我注意到中位数没有内置的计算类型(只有最高和最低)。

image of default calculations

有没有办法在iReport中获得字段的中位数或第50个百分位?

1 个答案:

答案 0 :(得分:3)

JasperReports中没有内置中值计算。

仍然可以通过手动收集列表中的值,然后使用Apache Commons Math进行计算来获得中位数。

请参阅以下示例。该报告还使用Apache Commons Lang将包装器数组转换为基本数组。要运行报告,您需要将commons-math3-x.y.z.jar和commons-lang3-x.y.jar添加到类路径中。

<?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="FirstJasper" columnCount="1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30">
    <style name="Sans_Normal" isDefault="true" fontName="DejaVu Sans" fontSize="8"/>
    <queryString>SELECT * FROM Orders</queryString>
    <field name="Freight" class="java.lang.Double"/>
    <variable name="FreightList" class="java.util.List">
        <variableExpression>$V{FreightList}</variableExpression>
        <initialValueExpression>new java.util.ArrayList()</initialValueExpression>
    </variable>
    <variable name="AddFreight" class="java.lang.Boolean">
        <variableExpression>$V{FreightList}.add($F{Freight})</variableExpression>
    </variable>
    <title>
        <band height="50">
            <textField evaluationTime="Report">
                <reportElement x="5" y="5" width="350" height="40"/>
                <textFieldExpression><![CDATA["median is " + org.apache.commons.math3.stat.StatUtils.percentile(org.apache.commons.lang3.ArrayUtils.toPrimitive((Double[]) $V{FreightList}.toArray(new Double[$V{FreightList}.size()])), 50)]]></textFieldExpression>
            </textField>
        </band>
    </title>
    <detail>
        <band height="13">
            <textField pattern="0.00">
                <reportElement x="5" y="0" width="350" height="11"/>
                <textFieldExpression><![CDATA[$F{Freight}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>