Как суммировать данные из конкретной записи?

#java #sql

#java #sql

Вопрос:

     ___WORKER_ID___|_______OCCUR________
          20       |         1
          20       |         2
          21       |         3
          22       |         5
          20       |         1


    According to this table, I need to know each worker how many occur?
     Such as   Worker_id=20 has occur is 4   
               Worker_id=21 has occur is 8
  

Я могу получить два значения из этой рабочей таблицы с помощью этого кода

          String sql = "SELECT Table.worker_id,Table.occur FROM keyword_pages Table"
              " WHERE keyword_id="   PUID;

        conn = getConnection();
        stm = conn.createStatement();
        rs = stm.executeQuery(sql);
        while (rs.next()) {
            int kwd_id = rs.getInt(1);    /**Worker_id is 20,20,21,22,20*/
            int occur = rs.getInt(2);     /**Worker_id is 1,2,3,5,1*/          

        }
  

Как получить количество событий для каждого работника?

Это мое кодирование. Я использую hashmap для хранения каждой записи. и сохраните hashmap в linklist. Но у меня нет идеи для получения результата.

   conn = getConnection();
        stm = conn.createStatement();
        rs = stm.executeQuery(sql);
        while (rs.next()) {
            int kwd_id = rs.getInt(1);
            int occur = rs.getInt(2);
            hMap.put(kwd_id, occur);
            listID.add(hMap);
            //System.out.println(kwd_id  "  |  "  occur);
        }

        for (int i = 0; i < listID.size(); i  ) {


        }          
  

Комментарии:

1. A Map<Integer,Integer> позволяет сохранять целочисленные значения для каждого идентификатора рабочего.

2. select worker_id, sum(occur) from keyword_pages group by worker_id

3. Повторное добавление hMap в ListID ни к чему вас не приведет.

Ответ №1:

 String sql = "SELECT T.worker_id, SUM(T.occur) AS osum"
          " FROM keyword_pages T"
          " WHERE keyword_id="   PUID
          " GROUP BY T.worker_id";
  

Теперь rs.getInt(2) или rs.getInt("osum") даст сумму группы.

Ответ №2:

 Map<Integer,Integer> id2count = new HashMap<>();

while (rs.next()) {
        int kwd_id = rs.getInt(1);    /**Worker_id is 20,20,21,22,20*/
        int occur = rs.getInt(2);     /**Worker_id is 1,2,3,5,1*/          
   Integer count = id2count.get( kwd_id );
   if( count == null ){
       count = Integer.valueOf( 1 );
   } else {
       count  = occur;
   }
   id2count.put( kwd_id, count );
}
  

** Позже **

Код для извлечения и печати накопленных значений:

 for( Integer key: id2count.keySet() ){
    System.out.println( key   ": "   id2count.get(key) );
}
  

Комментарии:

1. Количество целых чисел = id2count.get( kwd_id); что-то не так. он переходит в cath (исключение)

2. Этот код абсолютно правильный. Вы правильно скопировали его? Если есть исключение NullPointerException: вы правильно инициализировали id2count?