博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

转摘:解决动态列固定行月季年组合式报表

Posted on 2011-09-29 18:08  徐正柱-  阅读(474)  评论(0编辑  收藏  举报

简述以Cognos开发视角说数据仓库设计

Cognos8.3 Report Studio设计企业级分析报表已经满足大部分企业报表需求,但不能真正满足中国式特殊财务报表。基于工具本身特点,数据逻辑规划来看,对不符合数据结构性的手工报表很难一次性整合大的脚本实现。很多设计过类似报表的开发者,会用一贯的设计思路,在数据集市层整合所有数据源,利用Cognos工具简单取数,这种方式很好,但不灵活,每次需求变更就会改动过程与视图。对于高度集中企业数据严格保密的环境下,不是你想去数据库改改过程,调整程序。我的建议是根据现有开发设计环境思考一个问题,哪种解决办法最有效,最快捷能体现需求变更,前端应用调整相应及时。

商业BI系统中,设计的目标不是为核心业务系统的做业务报表,也不是给其他系统提供实时数据查询平台。如果理解成报表系统、数据大集中系统,或者类似于运营数据共享平台(ODS),这对设计EDW思路相违背,导致系统设计走上末路,不到两三年系统运营支撑相当难。合理的设计规划,有利二次开发与升级,降低IT运营成本,对往后系统二期、三期改造降低风险与开发周期。而这些设计跟前端报表有什么关系,我明确指出一点:需求调研、系统设计、模型规划、ETL倒换等后台设计处处都影响前端开发,前端是用户最直接最快捷反映系统运行能力与数据准确性。对设计前端人员需要了解更多需求,配合需求人员调研,结合当前系统使用的工具,以及应用开发架构等因素,规范报表格式,统一各业务部门需求指标,针对特殊报表或者财务上报数据另行讨论。

实施动态列固定行月季年组合式报表方案

什么是动态列固定行报表,动态列固定行报表是我自己提出的一种新说法,相信大家对平面报表的列表很清楚吧,列表就简单的固定列动态行报表。动态列是不固定的列成员,在一段时间里,列是根据业务数据动态响应,联动关联基础维度信息。固定行是横向观察,每行对应动态多个列,展现一个完整的记录信息。让我们了解一下动态列固定行年月季组合报表样式:
QQ截图未命名1.png

报表展现要求:日期列必须全部显示,没有值默认是“0”或者“/ ”,按日期月份选择,如:选择5月份,除6~12月份、三四季度、下半年为空,,其他月份、季度、年必须有值。

逻辑设计思路

方法一:在数据集市层整合报表格式的数据,季度、年、全年在表数据体系,定义一个月季年维度,标识字段包含12月、四个季度、上下半年、全年。在数据实例层,统计日期与刚刚定义的月季年维度存在一个N:1的关系。

方法二:利用Cognos工具的特点,利用多个子查询UNION、JOIN组合实现,单独对季度、年、全年计算。而数据集市层不需要对事实表做处理,但做一个月季年维度视图。

 

利用方法二实例操作:

我比较赞成第二种方法,后台数据处理少,视图调整方便。子查询处理容易理解,图形界面友好,查错纠正易定位。

报表用的查询有:日期查询,客户统计分析_ALL。

详细设计图如下,各查询事先定义好,约束条件都捆绑在事实数据中。

日期查询与客户分析查询是通过外关联组合,表达式如下:

[客户分析查询].[CAL_MON_NUM] = [日期_查询].[CAL_MON_NUM]

客户分析查询中,关联字段CAL_MON_NUM是从自定义的月季年维度表取12个月编码,季度、上下半年、全年是基于12个月组合判断得到。

如下:

--季度

[客户分析查询].[CAL_MON_NUM]

case

when ([客服报表分析].[V_D_CAL_MON_ALL].[CAL_MON_NUM] in (1,2,3) ) then (13)

     when ([客服报表分析].[V_D_CAL_MON_ALL].[CAL_MON_NUM] in (4,5,6) ) then (14)

     when ([客服报表分析].[V_D_CAL_MON_ALL].[CAL_MON_NUM] in (7,8,9) ) then (15)

     when ([客服报表分析].[V_D_CAL_MON_ALL].[CAL_MON_NUM] in (10,11,12) ) then (16)

end



[客户分析查询].[CAL_MON_NM_1]

case when ([CAL_MON_NUM]=13) then ('一季度')

     when ([CAL_MON_NUM]=14) then ('二季度')

     when ([CAL_MON_NUM]=15) then ('三季度')

     when ([CAL_MON_NUM]=16) then ('四季度')

end



上下半年、全年方式同季度查询,并集月份、季度、半年、全年四个字查询。

日期查询也类似方法,得到的结果如下:



页面设计就根据自己报表的样式调整,但这类报表必须选择“交叉表”控件,因为列是动态的,以后数据库存在就显示,不存在就不显示。对于管理机构层,不确定因素,以后会发展潜在地区的分公司,就给予动态生成。

设计后,大概结果如下,因数据库只有12月测试数据。

总结:报表开发没有固定设计模式,不同需求,根据需求确定。虽然样式基本相似,在设计模型上要考虑前后端,报表控件选择,子查询组合等。