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.總結
學習使我快樂!