mysql> select -> sum(case when score<60 then 1 else 0 end) as '<60', -> sum(case when score>=60 and score<=69 then 1 else 0 end) as '60~69', -> sum(case when score>=70 and score<=79 then 1 else 0 end) as '70~79', -> sum(case when score>=80 and score<=89 then 1 else 0 end) as '80~89', -> sum(case when score>-90 then 1 else 0 end) as '>=90' -> from student_course -> ; +------+-------+-------+-------+------+ | <60 | 60~69 | 70~79 | 80~89 | >=90 | +------+-------+-------+-------+------+ | 2 | 1 | 1 | 1 | 10 | +------+-------+-------+-------+------+
采用mybatis時,xml文件配置如下處理:
<select id="getScoreStatistics" resultType="map"> select sum(case when score < 60 then 1 else 0 end) as '<60', sum(case when score >= 60 and score <= 69 then 1 else 0 end) as '60~69', sum(case when score >= 70 and score <= 79 then 1 else 0 end) as '70~79', sum(case when score >= 80 and score <= 89 then 1 else 0 end) as '80~89', sum(case when score >= 90 then 1 else 0 end) as '>=90' from student_course </select>
mapper接口:
Map<String, Object> getScoreStatistics();
注意,這裡如果使用 Map<String, Integer> 作為返回值,會報錯:
java.math.BigDecimal cannot be cast to java.lang.Integer
原因是,sum() 的結果是作為 java.math.BigDecimal 來處理的, 而他不能直接轉換成 java.lang.Integer,所以報錯。
正確的處理方法是,返回 Map<String, Object>,然後
{"<60":2,"60~69":1,"70~79":1,"80~89":1,">=90":5}
int count1 = Integer.parseInt(resultMap.get("<60").toString());
通過Object類型的 toString()方法,然後 Integer.parseInt() 這裡才能得到正確的結果。
當然我們也可以直接返回:Map<String, BigDecimal> getScoreStatistics();
然後通過BigDecimal.intValue() 來獲得我們需要的值:
Map<String, BigDecimal> getScoreStatistics();
Map<String, BigDecimal> resultMap = this.studentCourseMapper.getScoreStatistics();
int count = resultMap.get("<60").intValue();
總結:
1)sql中的 sum() 返回返回值在mybatis中是作為BigDecimal來返回的,所以我們有兩種方法來處理:
1> 返回 Object 值,然後通過 Integer.parseInt(obj.toString()); 來得到int值;
2> 返回 BigDecimal 值,然後通過 BigDecimal.intValue()得到需要的值,應該說我們推薦使用第二種方法。
2)mysql分段統計方法:sum(case when score<60 then 1 else 0 end)