• 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.总结

      学习使我快乐!

      

  • 相关阅读:
    在eclipse中安装 Activiti Designer插件
    Maven settings.xml配置(指定本地仓库、阿里云镜像设置)
    unity调用MMBilling_2.4.2 Android SDK.
    unity与Android相互调用
    Unity3D研究院之与Android相互传递消息
    Unity3D研究院之打开Activity与调用JAVA代码传递参数
    Objec c 字符串比较
    判断不同IOS设备
    Unity3D研究院之IOS本地消息通知LocalNotification的使用
    【Unity3D】iOS 推送实现
  • 原文地址:https://www.cnblogs.com/coloz/p/12065881.html
Copyright © 2020-2023  润新知