2016-07-19 19 views
2

Ich bereite einen Bericht in iReport vor, und ich muss den Median eines Felds für eine Variable berechnen, die in einer Kreuztabelle verwendet wird. Mir ist aufgefallen, dass es für den Median keine eingebaute Berechnungsart gibt (nur höchste und niedrigste).Wie berechnen Sie den Median für eine Variable in iReport?

image of default calculations

Gibt es eine Möglichkeit, die mittlere oder 50. Perzentil eines Feldes in iReport zu bekommen?

+1

Ich glaube, der Durchschnitt ist die Summe aller Werte/Anzahl der Werte. Ich brauche den Durchschnitt nicht, ich brauche das 50. Perzentil (der Mittelweg von der 1. und letzten Nummer) des Feldes. – Matt

+0

Der JasperReports Server hat einen Ausdruck für die Berechnung des Medianwert - Sie können versuchen, Quellcode zu betrachten –

+0

[Median Berechnung] (http://community.jaspersoft.com/questions/956516/median-calculation) - Post auf Jaspersoft Community –

Antwort

3

In JasperReports gibt es keine integrierte Medianberechnung.

Ein Median kann immer noch erhalten werden, indem man die Werte manuell in einer Liste sammelt und dann Apache Commons Math verwendet, um die Berechnung durchzuführen.

Siehe das folgende Beispiel. Der Bericht verwendet auch Apache Commons Lang, um ein Wrapper-Array in ein primitives Array zu konvertieren. Um den Bericht auszuführen, müssen Sie commons-math3-x.y.z.jar und commons-lang3-x.y.jar zum Klassenpfad hinzufügen.

<?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> 
+0

Muss ich einen Verweis auf eine Klasse oder etwas hinzufügen? Ich habe versucht, dies zu einem Textfeld hinzuzufügen, aber ich bekomme org.apache.commons.math3.stat.StatsUtils kann nicht zu einem Typ org.apache.commons.lang3.ArrayUtils kann nicht zu einem Typ die Methode aufgelöst werden toArray (Double) ist nicht definiert für den Typ Double @ dada67 – Matt

+0

Ja, Sie brauchen commons-math3 und commons-lang3 jars in Ihrem Klassenpfad. Ich habe die Antwort bearbeitet, um die Anforderungen klarer zu machen. – dada67

+0

Gute Frage und die gute Antwort –