1

我需要在 Jasper iReport 中绘制一个图表,可以根据用户选择对结果进行汇总。假设我有水果桌:

id (pk)       town          bananas          orange          cherry 
1            boston           5                 0              11              
2            paris            100               18             12              
3            bucharest        10                3              9
4            barcelona        9                 4              12              

从带有 ireport 参数的 Jasper Web 服务器输入控件 (java.util.collection) 用户将选择水果/水果。

我需要总结用户选择的所有水果并绘制图表。

例如,当用户同时选择“香蕉”和“橙子”时,结果将是

              town          result  
1            boston           5 
2            paris            118 
3            bucharest        13 
4            barcelona        13 

问题是:

我做不到 select sum(bananas,orange) as result from fruits group by town

mysql sum 函数不能以这种方式工作,但这是 jasper 输入控件将用户选择返回给报告查询的方式。

我试过SELECT (SELECT REPLACE('bananas,orange', ',', '+')) as result from fruits group by town了,但是 MySQL 不能将替换语句识别为列名。我明白了:

              town          result  
1            boston           bananas+orange 
2            paris            bananas+orange
3            bucharest        bananas+orange
4            barcelona        bananas+orange

同样,SELECT sum(SELECT REPLACE('bananas,orange', ',', '+')) as result from fruits group by town 将返回 0 作为结果

任何的想法?也许这可以从 ireport 完成..?

4

1 回答 1

0

您可以根据用户指定的输入参数动态创建以下查询(使用存储过程)。然后存储过程将成为您在 JRXML 中的数据源。

select id, town, sum(bananas) + sum(oranges) as result from fruits group by town

我现在认为这很混乱。

另一种方法是重构 FRUIT_SALES 表,如下所示

CREATE TABLE "SEEDY_FOODS"."FRUIT_SALES"
  (
    "ID"            NUMBER NOT NULL ENABLE,
    "TOWN"          VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "FRUIT_TYPE_ID" NUMBER,
    "QTY_SOLD"      NUMBER NOT NULL ENABLE,
    CONSTRAINT "FRUIT_SALES_PK" PRIMARY KEY ("ID") 
  )

样本数据

FRUIT_SALES
 ID TOWN    FRUIT_TYPE_ID  SALES
 1  boston  1              5
 2  boston  2              0
 3  boston  3              11
 4  paris   1              100
 5  paris   2              18
 6  paris   3              12

然后有一个参考表,如。

CREATE TABLE "SEEDY_FOODS"."FRUIT_TYPES"
  (
    "ID"   NUMBER NOT NULL ENABLE,
    "NAME" VARCHAR2(20 BYTE)
  )

样本数据

FRUIT_TYPE
 ID NAME
 1  bananas
 2  orange
 3  cherry

上面的 DDL SQL 是使用 SQL Developer 为 Oracle 创建的。您将需要在 MySQL 上验证此语法

现在,作为 Jasper 报表数据源的目标查询变为

select town, sum(qty_sold)
from fruit_sales
where $X{IN,FRUIT_TYPE_ID,COUNTED_FRUIT_TYPES}
group by town

在这里,我们使用 JasperReports 功能$X{IN,<column>,<PARAMETER>}仅选择那些符合$P{COUNTED_FRUIT_TYPES}类型参数中指定的水果标准的行java.util.Collection

这是 JXRML 的开始

<?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="FruitSalesByTown" 
              language="groovy" pageWidth="595" pageHeight="842" columnWidth="535" 
              leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" 
              uuid="9cc45ae0-15a8-4f13-8e02-b0a4379f7019">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
 :
 :
snip style tags 
 :
 :
    <parameter name="COUNTED_FRUIT_TYPES" class="java.util.Collection"/>
    <queryString>
        <![CDATA[select town, sum(qty_sold)
from fruit_sales
where $X{IN,FRUIT_TYPE_ID,COUNTED_FRUIT_TYPES}
group by town]]>
    </queryString>

(参考 Jasper 报告终极指南的第 80 页)

于 2012-07-05T16:56:13.560 回答