【问题标题】:Get the last record in each group with sum/count使用 sum/count 获取每组中的最后一条记录
【发布时间】:2021-01-26 15:26:15
【问题描述】:

有一个表table1包含如下数据: 代码和金额是table1的字段。

我想从 table1 的记录中生成报告,并按每个代码分组,并得到每个代码的总和,如下所示

关于如何生成上述输出的任何想法? 用于Java开发

【问题讨论】:

  • 在 Java 中? MYSQL 不适合(或设计为)以最基本的方式呈现数据。你真的想要标题行、数据行、总和行和空白行在你的问题中。

标签: java mysql group-by sum


【解决方案1】:

您确实在此处寻找 2 组结果。单独的行输出和按输出分组需要 2 个单独的查询。

你可以

SELECT code, amount
FROM table1
ORDER BY code

对于单个金额,并且

SELECT code, sum(amount)
FROM table1
GROUP BY code

总和。

就我个人而言,我宁愿避免进行第二次查询。只需使用第一个查询并在我的 Java 代码中进行求和/格式化。

【讨论】:

    【解决方案2】:

    您可以collect 从此表中的地图并将重复项分组到list。然后,为了表示数据,您可以遍历此地图并获取每个列表的 sum

    输出到降价表的示例:

    String[][] table = {
            {"aaa", "10"},
            {"aaa", "5"},
            {"aaa", "20"},
            {"bbb", "30"},
            {"bbb", "5"},
            {"ccc", "40"}};
    
    Map<String, List<Integer>> map = Arrays.stream(table)
            .collect(Collectors.toMap(
                    arr -> arr[0],
                    arr -> new ArrayList<>(List.of(Integer.parseInt(arr[1]))),
                    (list1, list2) -> {
                        list1.addAll(list2);
                        return list1;
                    }, TreeMap::new));
    
    // raw output
    System.out.println(map);
    // {aaa=[10, 5, 20], bbb=[30, 5], ccc=[40]}
    
    // output to the markdown table
    map.forEach((key, value) -> {
        System.out.println("| code | amount |");
        System.out.println("|---|---|");
        value.forEach(element ->
                System.out.println("| " + key + " | " + element + " |"));
        System.out.println("| <b>Sum</b> | <b>" + value.stream()
                .mapToInt(Integer::intValue).sum() + "</b> |");
        System.out.println();
    });
    
    code amount
    aaa 10
    aaa 5
    aaa 20
    Sum 35
    code amount
    bbb 30
    bbb 5
    Sum 35
    code amount
    ccc 40
    Sum 40

    【讨论】:

      猜你喜欢
      • 2023-01-28
      • 2017-12-15
      • 2022-10-14
      • 1970-01-01
      • 2011-09-06
      • 2020-10-01
      • 2022-01-19
      • 1970-01-01
      • 2020-04-09
      相关资源
      最近更新 更多