動態行轉列,網上很多例子都是通過存儲過程來實現,其實這樣挺麻煩,可以通過現在代碼中拼接字符串方式,實現.
使用場景,當需要行轉列查詢時,如果轉化後列是動態的,可以先將列的字段去重查詢出來,然後在java代碼中進行sql拼裝,然後再作爲參數傳入sql,注意mybatis去參數的時候用${param},才能編譯,不能使用#{param}方式,不然會當成字符串不會進行編譯.
實例,在不確定有多少課程的時候,需要進行動態行轉列,
方式一:不使用動態存儲過程實現
步驟一:去重查詢所有的課程
select distinct coursenm from table1;
得到課程集合coursenmList;
步驟二:變量課程拼裝動態sql語句
//拼裝行轉列,類似於下面這種語句 // MAX( CASE coursenm WHEN '大學語文' THEN scores else 0 END ) AS 大學語文, StringBuilder sb = new StringBuilder(); for (String s : coursenmList) { sb.append("MAX( CASE coursenm WHEN '" + s); sb.append("' THEN scores ELSE 0 END ) AS " + s + ","); } //移除最後一個逗號 String sql = sb.subSequence(0, sb.length() - 1).toString(); 步驟三: 在dao寫接口,可以根據實際場景增加其他參數
List<Map<String, Object>> getResult(@Param("sql") String sql);
步驟四: mybatis的mapper.xml 取參數,返回結果是map
<select id="getResult" resultType="java.util.Map">
select stuid ,stunm,${sql} from table group by stunm
</select>