Jasper reports 按表达式排序的交叉表排序列/行组中的排序
我知道这里已经有一个类似的线程,但这对我不起作用 背景:Jaspersoft Studio 6 我有这样一个数据集: 在此数据集上创建了如下交叉表: 如何将列组排序为prod c、prod a、prod b而不是当前 我尝试按列组的表达式对该表达式进行排序 但是它说 编辑:添加了源代码,这是一个没有排序的版本,它运行正常,没有错误,当然没有排序Jasper reports 按表达式排序的交叉表排序列/行组中的排序,jasper-reports,crosstab,Jasper Reports,Crosstab,我知道这里已经有一个类似的线程,但这对我不起作用 背景:Jaspersoft Studio 6 我有这样一个数据集: 在此数据集上创建了如下交叉表: 如何将列组排序为prod c、prod a、prod b而不是当前 我尝试按列组的表达式对该表达式进行排序 但是它说 编辑:添加了源代码,这是一个没有排序的版本,它运行正常,没有错误,当然没有排序 <?xml version="1.0" encoding="UTF-8"?> <!-- Created with Jasper
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.2.0.final using JasperReports Library version 6.2.0 -->
<!-- 2016-06-08T14:14:48 -->
<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="test3" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="0a3345e5-7859-4366-9ccf-b215cf60a3b0">
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="vha"/>
<style name="Crosstab_CH" mode="Opaque" backcolor="#F0F8FF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Crosstab_CG" mode="Opaque" backcolor="#BFE1FF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Crosstab_CT" mode="Opaque" backcolor="#005FB3">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<style name="Crosstab_CD" mode="Opaque" backcolor="#FFFFFF">
<box>
<pen lineWidth="0.5" lineColor="#000000"/>
<topPen lineWidth="0.5" lineColor="#000000"/>
<leftPen lineWidth="0.5" lineColor="#000000"/>
<bottomPen lineWidth="0.5" lineColor="#000000"/>
<rightPen lineWidth="0.5" lineColor="#000000"/>
</box>
</style>
<queryString>
<![CDATA[select 'channel a' as "sales channel", 'prod a' as product, 1 as amount
union all select 'channel a' as salesChannel, 'prod b' as product, 1 as amount
union all select 'channel a' as salesChannel, 'prod c' as product, 1 as amount
union all select 'channel b' as salesChannel, 'prod a' as product, 1 as amount
union all select 'channel b' as salesChannel, 'prod b' as product, 1 as amount
union all select 'channel b' as salesChannel, 'prod c' as product, 1 as amount]]>
</queryString>
<field name="sales channel" class="java.lang.String"/>
<field name="product" class="java.lang.String"/>
<field name="amount" class="java.lang.Integer"/>
<background>
<band splitType="Stretch"/>
</background>
<summary>
<band height="224" splitType="Stretch">
<crosstab>
<reportElement x="91" y="24" width="459" height="200" uuid="66af64fd-5d36-48a9-9356-f1c2cd55f6a0">
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
</reportElement>
<rowGroup name="sales channel1" width="60" totalPosition="End">
<bucket class="java.lang.String">
<bucketExpression><![CDATA[$F{sales channel}]]></bucketExpression>
</bucket>
<crosstabRowHeader>
<cellContents mode="Opaque" style="Crosstab_CH">
<textField>
<reportElement x="0" y="0" width="60" height="20" uuid="27883596-a403-4b9a-a3d5-d18adced1ec1"/>
<textFieldExpression><![CDATA[$V{sales channel1}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabRowHeader>
<crosstabTotalRowHeader>
<cellContents mode="Opaque" style="Crosstab_CT">
<staticText>
<reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="7e48fc9b-d619-4b04-8b50-4fbd6174509e"/>
<text><![CDATA[Total sales channel1]]></text>
</staticText>
</cellContents>
</crosstabTotalRowHeader>
</rowGroup>
<columnGroup name="product1" height="20" totalPosition="End">
<bucket class="java.lang.String">
<bucketExpression><![CDATA[$F{product}]]></bucketExpression>
</bucket>
<crosstabColumnHeader>
<cellContents mode="Opaque" style="Crosstab_CH">
<textField>
<reportElement x="0" y="0" width="60" height="20" uuid="81d54f8e-11ab-4841-9aef-ef224899c337"/>
<textFieldExpression><![CDATA[$V{product1}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabColumnHeader>
<crosstabTotalColumnHeader>
<cellContents mode="Opaque" style="Crosstab_CT">
<staticText>
<reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="0925adf9-e1d5-4b68-a7c5-0650b7e72721"/>
<text><![CDATA[Total product1]]></text>
</staticText>
</cellContents>
</crosstabTotalColumnHeader>
</columnGroup>
<measure name="amount_MEASURE1" class="java.lang.Integer" calculation="Count">
<measureExpression><![CDATA[$F{amount}]]></measureExpression>
</measure>
<crosstabCell width="60" height="20">
<cellContents mode="Opaque" style="Crosstab_CD">
<textField>
<reportElement x="0" y="0" width="60" height="20" uuid="cdbc8bf6-e55f-4e69-9505-d40d01870add"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
<crosstabCell width="60" height="20" columnTotalGroup="product1">
<cellContents mode="Opaque" style="Crosstab_CT">
<textField>
<reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="3543f652-7dee-43fd-84ba-514613b8ac03"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
<crosstabCell width="60" height="20" rowTotalGroup="sales channel1">
<cellContents mode="Opaque" style="Crosstab_CT">
<textField>
<reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="9657bd6f-c862-4462-b88f-6ea0e049a3ad"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
<crosstabCell width="60" height="20" rowTotalGroup="sales channel1" columnTotalGroup="product1">
<cellContents mode="Opaque" style="Crosstab_CT">
<textField>
<reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="8311db87-f185-447a-b692-ce878b7fdff5"/>
<textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
</crosstab>
</band>
</summary>
</jasperReport>
使用“按表达式排序”时,无法访问任何字段
$F{}
,只能测量变量(从):
表达式是在交叉表组的上下文中计算的,可以引用度量变量,这些度量变量的计算结果为组总数
编辑
在创建交叉表时,测量变量是预定义的。它们遵循一种模式(来自“理解交叉表总变量”):
当您有多个行或列组时,可以使用交叉表总计变量组合不同聚合级别的数据(例如,计算百分比)。以下内置变量可用:
•\uu ALL
:指定列组和当前行中所有条目的总和
•\uu ALL
:指定行组和当前列中所有条目的总和
•\uuuuu ALL
:指定行和列组中所有条目的总和
也可以从度量值的“属性”视图的“文本字段”选项卡上的表达式字段的表达式编辑器中选择这些变量
据我所知,您可以使用这些变量对结果进行分组和排序。这些变量显示在交叉表的表达式编辑器中(源代码中有一个屏幕截图)。正如@tobi6在他的文章中提到的,您可以在orderByExpression中使用度量值(您还可以将bucket与$V{}表达式一起使用,但这可能是一种困难的方法) 在您的例子中,最简单的方法是添加带有排序规则的新度量
<measure name="productForSort" class="java.lang.Integer">
<measureExpression><![CDATA[$F{product}.equals("prod b") ? 1 : $F{product}.equals("prod c") ? 2 : 3]]></measureExpression>
</measure>
结果是这样的:
正如你所看到的,“产品b”是第一位的
注: 问题是类似的(重复)一个非常好的帖子。你可以在这篇文章中找到更多信息 我的答案与@PetterFriberg的答案类似。但在这种情况下,我们可以使用比较器
另外两个答案也很好,特别是@AndreasDietrich的R&D,仅供参考,在Jasper Studio 6.4中,我无法从Order by下拉列表中选择GUI中的度量值,但当我手动在GUI表达式框中或直接在xml中键入度量值时,它会起作用
<variable name="Data_Sort" class="java.lang.Double">
<variableExpression><![CDATA[($P{Variance}=="Positive" ? $V{Vol_Diff}:(($P{Variance}=="Negative") ? $V{Vol_DiffInverse} :$V{Vol_AbsDiff}))]]>
</variableExpression>
</variable>
<measure name="DataSort_Measure" class="java.lang.Double">
<measureExpression><![CDATA[$V{Data_Sort}]]></measureExpression>
</measure>
<rowGroup name="Well.WellName" width="150">
<bucket order="Descending" class="java.lang.String">
<bucketExpression><![CDATA[$F{Well.WellName}]]></bucketExpression>
<orderByExpression><![CDATA[$V{DataSort_Measure}]]>
</orderByExpression>
</bucket>
@AlexK是的,它不进行排序。已更新,添加了源。@tobi6否,它只是一个简单的报告。@AlexK的可能副本,它说:未找到字段:product1@tobi6但我该怎么办呢?谢谢你的回答。事实上,我看过那个帖子,但不知道如何使用comparatorExpression。这篇文章至少证明没有可比较的表达i
<variable name="Data_Sort" class="java.lang.Double">
<variableExpression><![CDATA[($P{Variance}=="Positive" ? $V{Vol_Diff}:(($P{Variance}=="Negative") ? $V{Vol_DiffInverse} :$V{Vol_AbsDiff}))]]>
</variableExpression>
</variable>
<measure name="DataSort_Measure" class="java.lang.Double">
<measureExpression><![CDATA[$V{Data_Sort}]]></measureExpression>
</measure>
<rowGroup name="Well.WellName" width="150">
<bucket order="Descending" class="java.lang.String">
<bucketExpression><![CDATA[$F{Well.WellName}]]></bucketExpression>
<orderByExpression><![CDATA[$V{DataSort_Measure}]]>
</orderByExpression>
</bucket>