mysql动态⾏转置_简化实现动态⾏列转置的SQL
⾏转列使⽤SQL完毕⼀般有下⾯⼏种⽅法:
1、 使⽤⾏列转换函数
Oracle11g及以上和MSSQL2005+提供了⾏列转置运算符pivot和unpivot,前者⽤于⾏转列,后者⽤于列转⾏。使⽤时须要指定⽬标列,对于动态列的场景⽆法直接完毕。
2、 使⽤CASE表达式
对于不⽀持pivot的数据库。如Mysql、DB2。能够使⽤case when条件表达式完毕。与pivot类似,须要依据⽬标列固定写死,⽆法直接写出动态列结构转换。
对于动态列的情况。仅仅能:
3、 拼接动态SQL
处理动态⾏列转换时往往须要在存储过程中拼接动态SQL完毕,因为数据库间的差异,写法与难易程度也不尽同样。⽆法编写通⽤的SQL语句。
实际情况中中,⾏列转换往往还伴随列间计算。增⼤了转置时的难度。
⾏列转换的⽬的经常是为了进⼀步的数据呈现。也就是说会有个主程序(如报表⼯具等)接受结果以进⾏下⼀步操作。假设是Java主程序,则能够使⽤润乾集算器(免费版)来协助完毕这类转换。集算器是动态解释运⾏的脚本。完毕⾏列转换的代码更具通⽤性。
集算器提供了JDBC接⼝,能够置于Java应⽤程序与数据库之间。让应⽤程序继续象訪问数据库⼀样运⾏集算器脚本,不⽤改变应⽤结构。
以下以⼀个简单的样例说明⽤集算器怎样实现⾏列转换。并集成进Java主程序中。
1、简单的⾏转列
⼀般的⾏转列仅仅简单地将数据⾏转为结果列。不涉及复杂的列间计算。
如将以下的学⽣成绩表转为分科⽬展⽰的集合:
⽬标结果:
实现脚本:
A1:运⾏SQL取数,并按ID、SUBJECT排序;
A2-A3:按ID和SUBJECT分组,集算器保留了分组后的⼦集供后⾯计算使⽤;
A4:动态创建空的⽬标结果集;
A5-B5:循环A2的学⽣分组,依据SUBJECT分组将学⽣ID、姓名和各科⽬成绩写⼊结果集;
A6:返回结果集。
从上⾯代码能够看出採⽤集算器实现⾏转列的基本步骤:先动态计算出空的⽬标结果集(A4)。再计算出每⾏数据追加到结果集中(A5,B5)。在有了⽀持数据表对象的分步计算机制后,⾏转列的过程能够按⾃然思路编写出来。
集算脚本的计算结果能够⽤JDBC接⼝返回给JAVA主程序或报表⼯具,JAVA调⽤集算脚本代码:
Class.forName("com.esproc.jdbc.InternalDriver");
Connection("jdbc:esproc:local://");
//调⽤集算器脚本(类似存储过程),当中p1是集算器脚本⽂件名称
st=(com. esproc.jdbc.InternalCStatement)con.prepareCall("call p1 ()");
//运⾏脚本
//获取结果集
ResultSetrs = st.getResultSet();
……
返回值是符合JDBC标准的ResultSet对象,调⽤集算器脚本和訪问数据库的⽅法全然⼀样,熟悉JDBC的程序猿能够⾮常快掌握。
关于集算器JDBC的部署和调⽤的更具体信息可參考【集算器集成应⽤之被JAVA调⽤】。
2、不定长分组的⾏转列
上⼀个样例中,结果集的列(即科⽬)常常能够事先获知,这样⽤静态的pivot(或case when)语法写出来也不算⾮常困难。但假设结果集的列须要动态计算出来,⽤pivot就⾮常困难了。如本例中每类机制⽣产的产品列数不定:
要求依据最⼤的机组分组长度决定转换后的结果列数。⽬标结果:
实现脚本:
A1:运⾏sql从产量表中取数;
A2:按机组分组。在集算器中分组结果保留了分组结果(成员)以⽅便兴许使⽤和计算;
A3:求分组中最⼤成员个数,以确定结果集列数;
A4-A5:动态创建空结果集;
A6-B7:循环A2中分组结果。将每⼀个分组中的类别和产量写⼊A5结果序表中。
与上述类似。这段代码仍然是先动态⽣成空结果集。然后再计算出合适的数据追加。
本例的计算须要写出动态的SQL来拼出结果集,但因为要出最⼤的组才知道列数。拼结果也不是像⼀般的pivot那样能够⽤字段值直接相应成列。这就要写存储过程⼀步步地完毕才⽅便。
相对照较复杂的存储过程,集算脚本⽀持过程性计算,代码更加简洁、易编写。
3、包括列间计算的⾏转列
如開始提到的,⾏列转换的同⼀时候往往伴随列间计算,⽐如有数据:
要求依据指定年份(如2014),输出每⽉应付⾦额,若⽆当⽉数据,则当⽉应付⾦额为上⽉该值。
⽬标结果:
实现脚本:
A1:运⾏SQL取查询年数据;
A2:⽣成带有12个⽉的结果空序表;
A3:按客户分组;
A4-B7:循环分组。B5设置对应⽉份的应付⾦额。B6将空值置为前⼀个⽉的数值。B7将记录插⼊结果序表中。
运算过程仍然是先产⽣空结果集后追加数据,不同的是。这⾥要追加的数据须要常常⼀系列计算才⼲得到。
集算脚本⽀持有序运算。所以⾮常easy取到前⼀条记录的值。对于动态⾏列转换时发⽣的列间计算。与复杂SQL或存储过程相⽐。集算脚本更清晰易懂。
4、列转⾏
除了上述提到的转置,有时还有将⼀⾏多列数据转为多⾏数据(列转⾏)。例如以下数据,当中列数不定:
⽬标结果:
实现脚本:
sql自学难吗A1:运⾏SQL取数;
A2:创建⽬标结果空序表;
A3:依据A1集合的列数计算每条记录要拆分的⾏数;
A4-B4:循环A1集合,动态获取每列数据插⼊A2结果序表中。
简化实现动态⾏列转置的SQL
标签:存储过程  表达式  prepare  条件  设置  编写  jdbc  部署  ⽹上
本条技术⽂章来源于互联⽹,如果⽆意侵犯您的权益请点击此处反馈版权投诉

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。