为了账号安全,请及时绑定邮箱和手机立即绑定

在不使用聚合函数的情况下删除 sql 中的重复项

在不使用聚合函数的情况下删除 sql 中的重复项

眼眸繁星 2022-07-20 20:27:31
我开始学习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      = 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 clausemainSelectSQL+= "ORDER BY "+sort1Attr;//Executes the query and obtains the ResultSetResultSet rs= sqlStatement.executeQuery();String sort1Desc= "***";            String Sort1Prev= "*";我的问题是如何合并重复的项目并总结它们的数量?例如,我现在的代码只是在我的摘要报告中打印以下内容,建筑学 40工程学 56牙科 66建筑学 16计算机科学 10工程学 11建筑学 5输出应该只是:建筑学 61工程学 67牙科 66计算机科学 10建筑学 5我只是坚持如何做到这一点。我正在考虑使用 hashmap 或 hashset,但我不确定如何。感谢您的帮助,谢谢!
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

如果你真的不想在 sql 中使用聚合,你可以使用HashMap<String, Integer>. 像这样的东西:


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));

也许您需要TreeMap(有或没有比较器)来代替HashMap对来自 ResultSet 或其他东西的值的顺序、空值检查。


查看完整回答
反对 回复 2022-07-20
?
ITMISS

TA贡献1871条经验 获得超8个赞

必须涉及聚合函数,并且查询“没有聚合的聚合”没有任何魅力

有了这个下面的查询就可以了。我使用 sum 是因为您的 o/p 实际上看起来不像计数数据,而是已计数记录的总和

          SELECT NAME, SUM(*)
            FROM TABLE GROUP BY 
            NAME


查看完整回答
反对 回复 2022-07-20
  • 2 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号