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


    简述以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月测试数据。

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

  • 相关阅读:
    Python程序设计--第6章 面向对象编程
    Python程序设计--第5章 函数设计与使用
    Python程序设计--第4章 字符串与正则表达式
    Python程序设计--第3章 选择与循环
    Python程序设计--第2章 python序列
    Python程序设计--第1章 基础知识
    Python基本计算--除法
    ES6:对象新增方法
    ES6:字符串常用方法
    ES6:let和const用法
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/2195782.html
Copyright © 2020-2023  润新知