SELECT
SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS '<60',
SUM(CASE WHEN score BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS '60~69',
SUM(CASE WHEN score BETWEEN 70 AND 79 THEN 1 ELSE 0 END) AS '70~79',
SUM(CASE WHEN score BETWEEN 80 AND 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 |
+------+-------+-------+-------+------+
// 接口
Map getScoreStatistics(); // 報錯!
// 錯誤堆棧
java.math.BigDecimal cannot be cast to java.lang.Integer
MySQL SUM() 返回 DECIMAL 類型,JDBC 驅動映射為 java.math.BigDecimal,無法直接強轉 Integer。
Map getScoreStatistics();
// 使用
Map map = mapper.getScoreStatistics();
int count = Integer.parseInt(map.get("<60").toString());
Map getScoreStatistics();
// 使用
Map map = mapper.getScoreStatistics();
int count = map.get("<60").intValue(); // 直接轉換,性能更好
SUM(CASE WHEN ... THEN 1 ELSE 0 END)。BigDecimal/Long/Double,不要直接映射為 Integer。Map,調用 .intValue() 獲取整數。