首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 按年份統計數據庫各列總值:Map 嵌套分組聚合實現

     編輯:程式設計綜合問答

需求:數據表含字段 (日期、資產名稱、數量、金額、學校),按年份分組統計每學校每年資產總數量、總金額。

實體類設計


class Record {
    private String dateStr; // "2015-01-01"
    private String schoolName;
    private int money;
    // getter...
    public String getYear() { return dateStr.split("-")[0]; }
}

聚合邏輯:雙層 Map (年份 → 學校 → 累計值)


public Map> tongJi(List list) {
    Map> result = new HashMap<>();
    for (Record rd : list) {
        String year = rd.getYear();
        String school = rd.getSchoolName();
        int money = rd.getMoney();
        
        // 獲取或創建年份 Map
        Map schoolMap = result.computeIfAbsent(year, k -> new HashMap<>());
        // 累加學校金額
        schoolMap.merge(school, money, Integer::sum);
    }
    return result;
}
  • computeIfAbsent (JDK 8+) 簡化「不存在則創建」邏輯。
  • merge 簡化「累加或初始化」邏輯。

輸出報表


public void print(Map> map) {
    for (Map.Entry> yearEntry : map.entrySet()) {
        for (Map.Entry schoolEntry : yearEntry.getValue().entrySet()) {
            System.out.printf("Year: %s, School: %s, Total: %d%n", 
                yearEntry.getKey(), schoolEntry.getKey(), schoolEntry.getValue());
        }
    }
}

SQL 替代方案 (推薦大數據量)


SELECT YEAR(date_col) AS yr, school_name, SUM(money) AS total_money, COUNT(*) AS total_count
FROM assets
GROUP BY YEAR(date_col), school_name
ORDER BY yr, school_name;
  • 數據庫聚合效率遠高於 Java 內存處理,尤其百萬行以上。
  • Java 端僅負責格式化輸出。

擴展:統計多指標

將內層 Map 改為 Map,Stats 含 count, totalMoney, totalQuantity 等字段,merge 時累加各字段。

採用 JDK 8 Map 新方法編寫簡潔、高效的分組聚合邏輯,或下推至 SQL 層最大化性能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved