Вычислить среднее значение в sql и обновить его с помощью jdbc

Мне нужно рассчитать среднее значение в sql. Есть несколько записей с одним и тем же atr_name, но с разными оценками. Необходимо вычислить среднее значение каждой индивидуальной оценки atr_name и обновить его в таблице базы данных. Я пытаюсь загрузить данные в массив. Но я не получаю правильных результатов. Это просто дает мне одно имя с неправильным средним значением.

 ArrayList<String> sc = new ArrayList<String>();

resultSet = statement.executeQuery("select atr_name, avg(newScore) from scores");
while (resultSet.next()) {
    sc.add(resultSet.getString("atr_name"));
    sc.add(resultSet.getString("avg(newScore)"));
}

for (String a : sc) {
    System.out.println(" " + a);
}

Вам нужно добавить GROUP BY atr_name в свой запрос после FROM scores

Aleksandar Rakić 26.10.2018 09:14
0
1
1 008
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш код должен выглядеть так:

ArrayList<String> sc = new ArrayList<String>();

        resultSet = statement.executeQuery("select atr_name, avg(newScore) AS avgScore from scores GROUP BY atr_name;");
        while(resultSet.next())
        {
           sc.add(resultSet.getString("atr_name"));
           sc.add(resultSet.getString("avgScore"));
        }


        for(String a:sc)
        {
            System.out.println(" " + a);
        }

Это решило проблему, получив желаемый результат. Но я также хочу обновить это среднее значение в другой таблице, когда у меня есть atr_name. На самом деле я сделал таблицу «баллов», чтобы ввести новые баллы и просто вычислить среднее значение, но конечный результат будет постоянно обновлять среднее значение в другой таблице. Каждый раз, когда пользователь вводит новую оценку, среднее значение должно обновляться. Логическая подсказка, стоящая за этим, будет полезна. Я использую mysql с jdbc

Jitesh Soni 26.10.2018 09:26

С моей точки зрения, я бы этого не сделал. У вас есть оценки, вам просто нужно создать запрос, который всегда будет вычислять новое среднее значение вместо обновления этого значения в другой таблице. Но если вы хотите, вы можете создать новый выпуск, и кто-то вам в этом поможет.

Aleksandar Rakić 26.10.2018 09:43

В следующий раз, если вы зададите вопрос о базе данных, пожалуйста, добавьте имя базы данных и предпочтительно версию из базы данных. SQL отличается в разных базах данных.

В вашем заявлении отсутствует пункт о группе по.

попробуйте выбрать atr_name, avg (newScore) из группы оценок по atr_name

Ответ принят как подходящий

В вашем запросе отсутствует предложение GROUP BY. В большинстве баз данных он даже не запускается, но MySQL разрешает (в определенных режимах), и в результате вы получаете одну запись со средним значением на уровне таблицы и некоторым значением atr_name из определенной записи.

Но вы также можете использовать карту для хранения ключей atr_name и их средних оценок.

Map<String, Double> sc = new HashMap<>();
String sql = "SELECT atr_name, AVG(newScore) AS avgScore FROM scores GROUP BY atr_name";
rs = statement.executeQuery(sql);

while (rs.next()) {
    sc.put(rs.getString("atr_name"), rs.getDouble("avgScore"));
}

sc.forEach((k, v) -> System.out.println("atr_name: " + k + ", average score: " + v));

Обратите внимание, что я звоню в ResultSet#getDouble, чтобы получить среднее значение столбца newScore. Даже если столбец newScore целочислен, взятие среднего должно вернуть плавающую точку (я думаю).

Это решило проблему, получив желаемый результат. Но я также хочу обновить это среднее значение в другой таблице, когда у меня есть atr_name. На самом деле я сделал таблицу «баллов», чтобы ввести новые баллы и просто вычислить среднее значение, но конечный результат будет постоянно обновлять среднее значение в другой таблице. Каждый раз, когда пользователь вводит новую оценку, среднее значение должно обновляться. Логическая подсказка, стоящая за этим, будет полезна.

Jitesh Soni 26.10.2018 09:35

Вам следует изучить возможность использования триггера, если вы действительно этого хотите. Но я не рекомендую это. Среднее значение рассчитывается на основе данных в вашей таблице; это не исходные данные, поэтому я голосую за их хранение в нет.

Tim Biegeleisen 26.10.2018 09:36

Другие вопросы по теме