动态行列转换的计算在实际业务中非经常见,网上各类技术论坛上都有讨论,比方以下这些问题:
行转列使用SQL完毕一般有下面几种方法:
1、 使用行列转换函数
Oracle11g及以上和MSSQL2005+提供了行列转置运算符pivot和unpivot,前者用于行转列,后者用于列转行。使用时须要指定目标列,对于动态列的场景无法直接完毕。
2、 使用CASE表达式
对于不支持pivot的数据库。如Mysql、DB2。能够使用case when条件表达式完毕。与pivot类似,须要依据目标列固定写死,无法直接写出动态列结构转换。
对于动态列的情况。仅仅能:
3、 拼接动态SQL
处理动态行列转换时往往须要在存储过程中拼接动态SQL完毕,因为数据库间的差异,写法与难易程度也不尽同样。无法编写通用的SQL语句。
实际情况中中,行列转换往往还伴随列间计算。增大了转置时的难度。
行列转换的目的经常是为了进一步的数据呈现。也就是说会有个主程序(如报表工具等)接受结果以进行下一步操作。假设是Java主程序,则能够使用润乾集算器(免费版)来协助完毕这类转换。集算器是动态解释运行的脚本。完毕行列转换的代码更具通用性。
集算器提供了JDBC接口,能够置于Java应用程序与数据库之间。让应用程序继续象訪问数据库一样运行集算器脚本,不用改变应用结构。
以下以一个简单的样例说明用集算器怎样实现行列转换。并集成进Java主程序中。
1、简单的行转列
一般的行转列仅仅简单地将数据行转为结果列。不涉及复杂的列间计算。
如将以下的学生成绩表转为分科目展示的集合: