SQL 在常用报表业务中的归并、转换与信息汇总中的应用技巧
本文阐述并分步骤汇总了 SQL 数据库报表系统中最常见的三类典型问题:高效的行列间转换,多路数据归并,以及信息聚合汇总计算。
文中首先阐述各类问题的背景和报表客户的需求分析,然后分别论述各类问题的解决方案。对于行列转换问题,文中介绍了自适应性的行列间转换设计方法和程序样本,并验证实验结果可适应原行列内容和数据的动态改变;对于数据归并问题,采用 oracle9i 新增分析函数高效解决多行归并问题,并通过分步骤详细介绍中间结果集,介绍了几个典型分析函数的用法;对于信息汇总计算问题,介绍了几个常规的解决方案,并阐述各方案的优缺点,给出采用分析函数解决信息汇总计算问题的有效性。
读者将了解常用报表业务中的几个典型问题行列间转换(报表聚类),行数据归并(多对一报表汇总),以及信息聚合汇总计算(分析信息整合);并从文中了解多种解决方案的实施部署及性能比较。
报表业务中常见的归并、转换与汇总
报表业务经常会遇到数据行列间的归并、转换与信息汇总等需求。比如在股票分析报表中,对于同一只股票,通常会有多个研究员对其进行跟踪研究,由此便引发了多行归并的需求,即查询出每只股票和对应所有研究员汇总成单行信息;在学校总结以学生考试成绩排名为行的报表系统中,由于在录入学生成绩的时候往往采用单科单条录入方式,所以在汇总学生各科成绩的时候往往需要进行行列间转换以满足报表需求;又如在公司总结员工工作量和绩效考核的报表系统中,往往需要将工作量转变成总量的比例以满足各种绩效评估需求,这就需要对相应列进行汇总计算分析。上述这些应用都是在实际报表业务中的常见问题,本文将针对这典型的三类问题分别进行分析并给出可行的解决方案。
数据归并问题
很多报表项目都会遇到数据归并的问题,例如在投行的股票分析报表系统中通常会保存股票与研究员的对应关系数据。对于同一只股票,通常会有多个研究员对其进行跟踪研究和投资评级;由此引发一个非常常规的归并需求,即查询出每只股票和对应的研究员汇总归并行信息。
下面简单阐述一下上述数据归并需求。假设股票分析师报表系统中关于股票和分析师的表结构定义如下:
select Employee_SN, Employee_Name, PMR_Num,to_char(percent,'990.00')||'%' percent from ( select Employee_SN, Employee_Name, PMR_Num, round(100* PMR_Num /( sum(PMR_Num) over(order by PMR_Num rows between unbounded preceding and unbounded following)),2) percent from Workload_TB )
表 8. 百分比数据汇总结果集样例
Employee_SN Employee_Name PMR_Num percent 2007913938 Bao, Aiming 102 24.88% 2008916342 Jia, Fang 78 19.02% 2009919067 Shao, Lei 39 9.51% 2006911255 Zhang, Yibai 179 43.66% 2010920476 Zhai, Wei 12 2.93%
这种方法的优点在于 SQL 语句的可读性很强,对于总量不为零的实际问题,由于在大部分表的处理速度上比上述两种常规方法要快(避免了多次扫描相同表数据),所以分析函数的方法是非常可行的。在运用分析函数方法解决各类数据汇总计算的时候,要考虑数据排序的代价,在排序成本很高的情况下可以考虑采用其他方法;但如果对于序列化较强的列进行汇总计算,采用分析函数无疑是最为有效的办法。所以在实际汇总问题中,根据表规模不同,采取合适的解决方案,是非常关键的。