场景:有一个简单的销售数据分析,可以按照日期,按照商品类型来分析订单笔数和订单金额。

目的:用户可以自定义查看按照不同指标排序的数据,用户可以查看按照不同指标排名的前N名数据

一:功能及效果展示

效果1:进入报表,显示按默认指标排名的指定名次的数据(默认显示按订单金额排名的前5名)

效果2:改变排名规则,改变排名取值(例如:根据订单笔数排名,取前6,可以看到数据显示正常)

效果3:再次改变排名规则,报表自动刷新(例如:按订单金额排序,排名值不变,可以看到数据显示正常)

 二:报表开发技术重点

重点1:在列表的主查询中新建 '排名' 数据项

内容如下:

==========================================================

if(?sortmethod?=1)
then
(
rank ( [订单金额] for report)
)
else
(
rank ( [订单笔数] for report)
)

==========================================================

下面解释一下rank函数

rank ( 表达式 [ ASC|DESC ] { , 表达式 [ ASC|DESC ] } [ at 表达式 { , 表达式 } ] [ <for 选项> ] [ prefilter ] )
rank ( [ distinct ] 表达式 [ ASC|DESC ] { , 表达式 [ ASC|DESC ] }
[ <for 选项>] [ prefilter ] )
<for 选项> ::= for 表达式 { , 表达式 }|for
report|auto
返回选定数据项的排名值。排序顺序为可选;在默认情况下,采用降序(DESC)。如果两个或更多行排名相同,那么排名值
的序列中会有一个缺值(也称为
Olympic 排名)。“<for 选项>”定义函数的作用域。“at”选项定义聚合级别,只能在关系数
据源上下文中使用。Distinct
是与产品的较早版本兼容的替换表达式。空值排名最末。此函数出现在“GO 数据仓库(分析)”
数据包中的“2005 年排名前 10
位的零售商”示样报表中。
重点2:在列表的主查询中新建一个明细过滤器
 
注意:过滤器应用于自动聚合之后(自动聚合是指报表会根据维度自动的汇总当前的度量值)
重点3:友情提示的地方采用文本,文本值来源自参数值,随着变化而变化
新建文本,选择文本来源
 
  表达式内容为
========================================================

if(
(ParamDisplayValue('sortmethod'))='1'
or
(ParamDisplayValue('sortmethod'))='按订单金额排名'
)
then
('按订单金额排名')
else
(
'按订单笔数排名'
)

========================================================

解释一下if中的第一个条件:因为值提示数据来源是静态选项集合,无法指定使用值和显示值,但又是

必选的,所以默认值为1,用做查询中。但是经过测试,报表运行中值提示参数的值其实是显示值中文

的,所以无论是1还是中文名称都显示为中文名称,第一次默认之后,在以后就按照中文名称判断了。

效果就成了报表上方的一句话:

上面部分的红色字体都来自于:参数值 动态传参。

重点4:报表是如何实现怎么排序的?

这里也可以说是一个重点,大家可以看到排序的地方就是在新建数据项‘排名’的时候了,有这么一个代码

rank ( [订单金额] for report)/rank ( [订单笔数] for report)

这里对报表进行了排序操作

但是如果想要报表出现排序后的效果,从大到小,从多到少的顺序,那么上面的代码必须被执行,所以必须

让‘排名’数据项在报表中出现,才可以实现排名,下面我们把排名从报表中移除看一下:

从上面可以看到 ,排序顺序变了,可能是按照默认的升序出现了,那么当是海里数据的时候,第一的效果就看不到了。

所以在做按指定指标排序的时候,排序数据项必须拖入报表中,才可以起到排序的作用,当然如果不需要出现排名这一

列的话,隐藏这一列即可。

Cognos  reportstudio 中如何隐藏列?请参考:Cognos开发报表如何隐藏列?

效果已实现,文终于此。

Cognos开发自定义排序规则的报表和自定义排名报表的更多相关文章

  1. C++ set自定义排序规则(nyist 8)

    C++的容器大多数都是自动排序的,所以你使用这些容器时,你加入的元素类型必须是可以比较大小的,如果不是,则需要自定义排序规则,例如你自定义的结构体: #include <iostream> ...

  2. java编程排序之内置引用类型的排序规则实现,和自定义规则实现+冒泡排序运用

    第一种排序:[冒泡排序]基本数据类型的排序. [1]最简易的冒泡排序.效率低.因为比较的次数和趟数最多. /** * 最原始的冒泡排序. * 效率低. * 因为趟数和次数最多.都是按最大化的循环次数进 ...

  3. Extjs header column 自定义排序规则

    Extjs 的表格自带排序功能,这个功能在大部分情况下能够满足我们的需求,但是在某种情况下,例如IP排序,默认情况下,按照字符串进行排序, 此时我们需要自定义排序规则,这个时候就需要我们重写方法了, ...

  4. 2 weekend110的hadoop的自定义排序实现 + mr程序中自定义分组的实现

    我想得到按流量来排序,而且还是倒序,怎么达到实现呢? 达到下面这种效果, 默认是根据key来排, 我想根据value里的某个排, 解决思路:将value里的某个,放到key里去,然后来排 下面,开始w ...

  5. Python自定义排序及我实际遇到的一些题目实例

    写在前面,本文主要介绍Python基础排序和自定义排序的一些规则,如果都比较熟悉,可以直接翻到第三节,看下实际的笔试面试题中关于自定义排序的应用. 一.基础排序 排序是比较基础的算法,与很多语言一样, ...

  6. struts2 自定义校验规则

    自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...

  7. 【Java】Treeset实现自定义排序

    两个类,一个学生类,含姓名和出生日期两个属性:还有一个学生排序类,重写compare函数,自定义排序规则是先比较出生日期,如果相同再比较姓名字母 package birthday; import ja ...

  8. Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序

    /** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...

  9. map的默认排序和自定义排序

    STL的容器map为我们处理有序key-value形式数据提供了非常大的便利,由于内部红黑树结构的存储,查找的时间复杂度为O(log2N). 一般而言,使用map的时候直接采取map<typen ...

随机推荐

  1. laya IDE 初始化设置

    切换到 编辑模式(显示UI的界面)--按F9--- 修改 资源发布目录为  bin/

  2. DataGridView、List<T>相关操作

    一.DataGridView数据转成DataTable 1.已绑定过数据源:DataTable dt = (dataGridView1.DataSource as DataTable) 2.未绑定过数 ...

  3. 「HNOI2018」转盘

    「HNOI2018」转盘 现场推出了大部分结论但是只写了 \(40\) 分暴力,被贺指导踩爆,现在还有点怀念 HNOI2018 贺指导对着镜子荒野行动的日子,那几天他云球迷瞎**指点篮球,被送上指导称 ...

  4. tyvj 1031 热浪 最短路

    热浪 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://tyvj.cn/p/1031 Description 德克萨斯纯朴的民眾们这个夏天正在遭受 ...

  5. Codeforces Round #294 (Div. 2)B - A and B and Compilation Errors 水题

    B. A and B and Compilation Errors time limit per test 2 seconds memory limit per test 256 megabytes ...

  6. MySQL在控制台上以竖行显示表格数据

    直接在SQL语句后面加\G即可,如: select * from user limit 10\G; 如果想要知道这些参数可以直接在命令行后面加入\?

  7. erlang 中文社区 下载

    http://www.cnerlang.com/download/     erlang 下载 http://www.blogjava.net/killme2008/archive/2007/06/1 ...

  8. TCP Socket的一些行为

    几个重要的结论: 1. read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满时返回. 只有当receive buffer为空时,blocking模式才会等待,而nonb ...

  9. Vue 组件 data为什么是函数?

    在创建或注册模板的时候,传入一个data属性作为用来绑定的数据.但是在组件中,data必须是一个函数,而不能直接把一个对象赋值给它. Vue.component('my-component', { t ...

  10. 基于遗传算法求解TSP问题(Java界面)

    近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一 ...