Oracle实现行转列+Mybatis

1.需求

报表需要动态展示某几个公司分别在几个月内销售额情况(前端表头月份是动态的,月时间段是前端参数来选择的,最大为12个月),

页面展示如下

Oracle实现行转列+Mybatis

Oracle数据库中数据如下:

Oracle实现行转列+Mybatis

可以看到一个公司的月份数据是行的,现在要转成列

2.难点

①行怎么转列

②转成列后[''2019-01"][''2019-02"]....这种列名需要动态转成 [month1][month2]...这种列名~否则Java里面的VO层展示不出来

3.思路

当然是百度咯~ 

4.行转列

"道生一,一生二,二生需求"~先把第一个给实现一下! 通过一番搜索,有一个函数貌似符合pivot ,不管了先试一把!

select *
from (select NAME, MONEY, MONTH
from TEST)
pivot (max(MONEY) for MONTH in (
'2019-01' ,
'2019-02' ,
'2019-03'
)
);

效果:

Oracle实现行转列+Mybatis

emmmm......就是这个效果~

5.mybatis动态传参数和列名

我们先手动把月份数组转一下,换成我们自定义的列名

select *
from (select NAME, MONEY, MONTH
from TEST)
pivot (max(MONEY) for MONTH in (
'2019-01' AS month1 ,
'2019-02' AS month2 ,
'2019-03' AS month3
)
);

好了,效果符合预期~现在剩下的问题就是:

'2019-01' AS month1,怎么通过参数动态传到mybatis中?
传参方式有2种: ${} 和 #{} (具体区别自行百度)
  • ${} 替换结果不会增加单引号---也就是说参数传"2019-01" 解析出来后是 2019-01
  • #{} 替换结果会增加单引号---也就是说参数传"2019-01" 解析出来后是 "2019-01"

照这么看:我们应该使用:  #{月份参数}  AS   ${列名}  这种形式

 但是~ 运行起来就报错~ 如下所示:

-------------------------------------------------------

Oracle实现行转列+Mybatis

-------------------------------------------------------

所以老老实实都换成 ${}这种形式~

mybatis关键部分代码参考如下:

Oracle实现行转列+Mybatis

Java中传参是monthList

Oracle实现行转列+Mybatis


5.总结

学习使我快乐!

上一篇:CF570D——Tree Requests


下一篇:Oracle中"行转列"的实现方式