猿问

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

我开始学习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 clause

mainSelectSQL+= "ORDER BY "+sort1Attr;



//Executes the query and obtains the ResultSet

ResultSet rs= sqlStatement.executeQuery();


String sort1Desc= "***";            

String Sort1Prev= "*";


我的问题是如何合并重复的项目并总结它们的数量?


例如,我现在的代码只是在我的摘要报告中打印以下内容,


建筑学 40

工程学 56

牙科 66

建筑学 16

计算机科学 10

工程学 11

建筑学 5


输出应该只是:


建筑学 61

工程学 67

牙科 66

计算机科学 10

建筑学 5


我只是坚持如何做到这一点。我正在考虑使用 hashmap 或 hashset,但我不确定如何。感谢您的帮助,谢谢!


眼眸繁星
浏览 99回答 2
2回答

手掌心

如果你真的不想在 sql 中使用聚合,你可以使用HashMap<String, Integer>. 像这样的东西:Map<String, Integer> aggResult = new HashMap<>();while (rs.next()) {&nbsp; &nbsp; String name = rs.getString(NAME_INDEX); //NAME_INDEX - name column index&nbsp; &nbsp; int value = rs.getInt(VALUE_INDEX); //VALUE_INDEX - value column index&nbsp; &nbsp; aggResult.merge(name, value, Integer::sum);&nbsp; &nbsp; //if you dont have java8 use this "if":&nbsp; &nbsp; /*&nbsp; &nbsp; if (aggResult.containsKey(name)) {&nbsp; &nbsp; &nbsp; &nbsp; Integer sum = aggResult.get(name);&nbsp; &nbsp; &nbsp; &nbsp; aggResult.put(name, sum + value);&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; aggResult.put(name, value);&nbsp; &nbsp; }&nbsp; &nbsp; */}//test output:aggResult.forEach((key, value) -> System.out.println(key + ": " + value));也许您需要TreeMap(有或没有比较器)来代替HashMap对来自 ResultSet 或其他东西的值的顺序、空值检查。

ITMISS

必须涉及聚合函数,并且查询“没有聚合的聚合”没有任何魅力有了这个下面的查询就可以了。我使用 sum 是因为您的 o/p 实际上看起来不像计数数据,而是已计数记录的总和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;NAME,&nbsp;SUM(*) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;TABLE&nbsp;GROUP&nbsp;BY&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAME
随时随地看视频慕课网APP

相关分类

Java
我要回答