Java 在不使用聚合函数的情况下删除sql中的重复项
我开始学习java,我的练习有问题 这是整个代码的一个片段:Java 在不使用聚合函数的情况下删除sql中的重复项,java,sql,oracle,hashmap,hashset,Java,Sql,Oracle,Hashmap,Hashset,我开始学习java,我的练习有问题 这是整个代码的一个片段: import java.io.PrintWriter; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Connection; import java.util.ArrayList; import java.sql.PreparedStatement; private static final int MAX_LINES =
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.util.ArrayList;
import java.sql.PreparedStatement;
private static final int MAX_LINES = 44;
private static final int REPORT_COL1 = 30;
private static final int REPORT_COL = 15;
private ArrayList<String> errors = new ArrayList<String>();
private ArrayList<String> detailReport = new ArrayList<String>();
private ArrayList<String> summaryReport= new ArrayList<String>();
String firstSortCode= (String) parameters.get("01");
if(firstSortCode==null || firstSortCode.trim().equals("")) {
errors.add("Missing required parameter 01");
invalidParameters= true;
}
else {
for(int i=0; i<SORT_CODES.length; i++) {
if(firstSortCode.equals(SORT_CODES[i][0])) {
pSort1 = SORT_CODES[i][1];
sort1Attr = SORT_CODES[i][2];
sort1GetDescTable = SORT_CODES[i][3];
sort1GetDescCode = SORT_CODES[i][4];
sort1GetDescValue = SORT_CODES[i][5];
val1 = firstSortCode + " - " + pSort1;
break;
}
}
if(pSort1.equals("")) {
errors.add("Invalid value '"+ firstSortCode + "' for parameter 01");
invalidParameters= true;
}
}
String mainSelectSQL ="SELECT shrdgmr_pidm, " +
" shrdgmr_levl_code, "+
" shrdgmr_grst_code, "
" NVL("+sort1Attr+", 'Not Reported') ";
mainSelectSQL =mainSelectSQL +
"FROM shrdgmr " +
"WHERE shrdgmr_pidm is not null " +
//Appends the ORDER BY clause
mainSelectSQL+= "ORDER BY "+sort1Attr;
//Executes the query and obtains the ResultSet
ResultSet rs= sqlStatement.executeQuery();
String sort1Desc= "***";
String Sort1Prev= "*";
//Arrays to hold the student counts for each of the reported sort values
int sort1Count= 0;
int grandTotal = 0;
while(rs.next()) {
String Value1 = rs.getString(2);
if(!Value1.equals(prevSort1Value)) {
String sort1Record= Library.lPad(sort1Count, REPORT_COL, ' ');
if(!sort1Desc.equals("***")) {
if(lineCount[0]+4>MAX_LINES) {
startNewPage(detailReport, pageCount, lineCount, currentDate,
databaseName, pGradTerm, pInitiator, sort1Desc, pSort1, false);
}
detailReport.add(Library.rPad(sort1Desc, REPORT_COL1, ' ')+sort1Record);
summaryReport.add(Library.rPad(sort1Desc, REPORT_COL1, ' ')+sort1Record);
lineCount[0]++;
}
//Resets the counter
sort1Count =0;
sort1Desc= getSortDescription(connection, pSort1, sort1GetDescValue, sort1GetDescTable,
sort1GetDescCode, Value1, errors);
}
sort1Count++;
导入java.io.PrintWriter;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.sql.Connection;
导入java.util.ArrayList;
导入java.sql.PreparedStatement;
专用静态最终整数最大线=44;
私有静态最终int报告\u COL1=30;
专用静态最终int报告\u COL=15;
private ArrayList errors=new ArrayList();
private ArrayList detailReport=new ArrayList();
私有ArrayList summaryReport=新ArrayList();
String firstSortCode=(String)parameters.get(“01”);
if(firstSortCode==null | | firstSortCode.trim().equals(“”){
错误。添加(“缺少必需参数01”);
无效参数=真;
}
否则{
对于(int i=0;iMAX_线){
开始新页面(detailReport、pageCount、lineCount、currentDate、,
数据库名、pGradTerm、PInitator、sort1Desc、pSort1、false);
}
detailReport.add(Library.rPad(sort1Desc,REPORT\u COL1',)+sort1Record);
summaryReport.add(Library.rPad(sort1Desc,REPORT_COL1',)+sort1Record);
行数[0]++;
}
//重置计数器
sort1Count=0;
sort1Desc=getSortDescription(连接,pSort1,sort1GetDescValue,sort1GetDescTable,
SORT1GetDescode,值1,错误);
}
sort1Count++;
我的问题是如何合并重复的项目并汇总它们的计数
例如,我现在的代码只是在我的总结报告中打印以下内容
架构40工程56
牙科66
架构16
计算机科学10
工程11
架构5
输出应仅为: 架构61
工程67
牙科66
计算机科学10
架构5
我只是被困在我怎么能做到这一点上。我正在考虑使用hashmap或hashset,但我不确定如何使用。感谢您的帮助,谢谢 必须涉及到聚合函数,而使用“聚合而不聚合”的查询是没有吸引力的 通过下面的查询可以完成所需的操作。我之所以使用sum,是因为您的o/p实际上看起来不像计数数据,而是已经计数记录的总和
SELECT NAME, SUM(*)
FROM TABLE GROUP BY
NAME
如果确实不想在sql中使用聚合,可以使用
HashMap
。诸如此类:
Map<String, Integer> aggResult = new HashMap<>();
while (rs.next()) {
String name = rs.getString(NAME_INDEX); //NAME_INDEX - name column index
int value = rs.getInt(VALUE_INDEX); //VALUE_INDEX - value column index
aggResult.merge(name, value, Integer::sum);
//if you dont have java8 use this "if":
/*
if (aggResult.containsKey(name)) {
Integer sum = aggResult.get(name);
aggResult.put(name, sum + value);
} else {
aggResult.put(name, value);
}
*/
}
//test output:
aggResult.forEach((key, value) -> System.out.println(key + ": " + value));
Map acgrestult=new HashMap();
while(rs.next()){
String name=rs.getString(name_INDEX);//name_INDEX-name列索引
int value=rs.getInt(值索引);//值索引-值列索引
merge(名称、值、整数::和);
//如果没有java8,请使用以下“如果”:
/*
if(攻击性结果容器(名称)){
整数和=acgreult.get(名称);
攻击结果put(名称、总和+值);
}否则{
输入(名称、值);
}
*/
}
//测试输出:
acgreult.forEach((键,值)->System.out.println(键+”:“+value));
也许您需要
TreeMap
(带或不带比较器)来代替HashMap
,以获得订单,对ResultSet或其他内容中的值进行空检查。使用sql的group by
您的输出表明源表中有多个行的集合,您希望在返回的结果中合并这些行的结果(也称为聚合)。这正是聚合函数的目的,那么为什么您要避免使用专门为您这样的问题设计的工具呢?是的,@Andronicus,除非有人试图避免聚合函数,正如OP所说的那样。JohnBollinger对,聚合而不聚合函数:)拥有它们有什么意义?