我有一个损益报告,当前有三个分组级别:1.药店2.客户3.包装类型
我已设置报告以提示用户提供药房,客户和包装类型的值。明细栏显示收入和保证金之类的度量。选择药房,客户或包装类型的默认值将返回组中的所有值。
我想知道- 如果用户选择“使用默认值”作为参数,是否可以告诉iReport汇总分组?现在,如果我选择了一家药店和一个客户,但使用默认的包装类型,则仍会得到几种包装类型的明细带。如何告诉iReport汇总所有包装类型?或者,如果未指定任何客户,则给定药房的所有客户总和?还是可以在查询中做到这一点?我有一个Oracle数据库,正在使用iReport Professional 4.5.1。
谢谢丽莎
编辑添加代码:
SELECT FAC.FILL_MONTH AS FILL_MO, FAC.PHAR_CODE AS PHAR_CODE, FAC.FAC_ID AS FAC_ID, FAC.PACKTYPE_CODE AS PACKTYPE, SUM(FAC.TOT_RXCOUNT_NUM) AS RX_COUNT, SUM(FAC.TOT_REVENUE_AMT) AS REVENUE, SUM(FAC.TOT_COGS_AMT) AS COGS, SUM(FAC.TOT_MARGIN_AMT) AS MARGIN FROM MySchema.Table FAC WHERE FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate} AND $X{IN, FAC.PHAR_CODE, pharmacy} AND $X{IN, FAC.FAC_ID, facility} AND $X{IN, FAC.PACKTYPE_CODE, packtype} GROUP BY FAC.PHAR_CODE, FAC.FAC_ID, FAC.PACKTYPE_CODE, FAC.FILL_MONTH ORDER BY PHAR_CODE ASC, FAC_ID ASC, PACKTYPE ASC, FILL_MO ASC
您具有正确的SQL,可以准确地获取所需的原始数据。但是PACKTYPE在特殊情况下(用户指定no),您需要对其进行修改以强制(和其他字段)进行不同的分组PACKTYPE。
PACKTYPE
创建一个新参数$P{PACKTYPE_SELECT_SQL}。它的默认值直接基于您现有参数的值$P{packtype}。(这意味着$P{packtype}必须首先出现在.jrxml中。)将$P{PACKTYPE_SELECT_SQL}默认值设置为如下所示:
$P{PACKTYPE_SELECT_SQL}
$P{packtype}
$P{packtype}==null ? " 'All Package Types' " : " FAC.PACKTYPE_CODE "
然后像这样修改SQL查询(仅修改一行,其余仅用于上下文):
SELECT FAC.FILL_MONTH AS FILL_MO, FAC.PHAR_CODE AS PHAR_CODE, FAC.FAC_ID AS FAC_ID, $P!{PACKTYPE_SELECT_SQL} AS PACKTYPE, ... WHERE FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate} AND $X{IN, FAC.PHAR_CODE, pharmacy} AND $X{IN, FAC.FAC_ID, facility} AND $X{IN, FAC.PACKTYPE_CODE, packtype}
在$P{packtype}不为null的情况下,生成的SQL将与以前完全相同。但是,在$P{packtype}null的情况下,您现在将获得一个硬编码的字符串来代替PACKTYPE_CODE。
大概您的报告正在分组PACKTYPE。因此,您应该能够保留报表中的布局和分组不变。
您可以想象各种变化,例如添加布尔输入控件以显式让用户选择是否在报告中保留PACKTYPE。但是,这个基本想法应该可以为您提供所需的东西。