【发布时间】:2021-01-26 15:26:15
【问题描述】:
有一个表table1包含如下数据: 代码和金额是table1的字段。
我想从 table1 的记录中生成报告,并按每个代码分组,并得到每个代码的总和,如下所示
关于如何生成上述输出的任何想法? 用于Java开发
【问题讨论】:
-
在 Java 中? MYSQL 不适合(或设计为)以最基本的方式呈现数据。你真的想要标题行、数据行、总和行和空白行在你的问题中。
有一个表table1包含如下数据: 代码和金额是table1的字段。
我想从 table1 的记录中生成报告,并按每个代码分组,并得到每个代码的总和,如下所示
关于如何生成上述输出的任何想法? 用于Java开发
【问题讨论】:
您确实在此处寻找 2 组结果。单独的行输出和按输出分组需要 2 个单独的查询。
你可以
SELECT code, amount
FROM table1
ORDER BY code
对于单个金额,并且
SELECT code, sum(amount)
FROM table1
GROUP BY code
总和。
就我个人而言,我宁愿避免进行第二次查询。只需使用第一个查询并在我的 Java 代码中进行求和/格式化。
【讨论】:
您可以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 |
【讨论】: