Oracle实现行转列+Mybatis

1.需求

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

页面展示如下

Oracle数据库中数据如下:

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

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'
        )
        );

效果:

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   ${列名}  这种形式

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

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

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

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

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

 Java中传参是monthList



5.总结

  学习使我快乐!

  

原文地址:https://www.cnblogs.com/coloz/p/12065881.html