Подсчитать отличное значение с 2 критериями

0

Я пытаюсь найти запрос JDBC MySQL, который найдет разные значения в определенном поле, посчитает количество вхождений этой обратной связи и затем сохранит его в списке массивов (если возможно, или если есть лучший способ хранения).

Company      Feedback    Person
------       --------    ------
Apple        Good          A
Pear         Bad           B
Apple        Neutral       C
Orange       Neutral       D
Apple        Bad           E
Apple        Neutral       F
Orange       Bad           G

Ожидаемый результат для Apple

Company     Feedback     Count
-------     --------     -----
Apple       Good           1
Apple       Neutral        2
Apple       Bad            1

Отредактировано для добавления в мой код:

//Already call an object from database
rs = db.getSM().executeQuery("SELECT COUNT(*) AS 
rowcount FROM predata WHERE company = 'Apple' and feedback LIKE 'G%'");
rs.next();
System.out.println(rs.getInt("rowcount"));

rs = db.getSM().executeQuery("SELECT COUNT(*) AS 
rowcount FROM predata WHERE company = 'Apple' and sentiment LIKE 'N%'");
rs.next();
System.out.println(rs.getInt("rowcount"));

Этот метод работает для меня, но я пытаюсь сократить весь код, не повторяя код снова и снова

  • 1
    Может быть, этот запрос может помочь вам SELECT Company, Feedback, COUNT(*) FROM TableName GROUP BY Company;
  • 2
    @YCF_L WHERE Company = 'Apple' GROUP BY Feedback;
Показать ещё 4 комментария
Теги:
jdbc

2 ответа

0

Вы можете запросить все пары обратной связи между компаниями и сохранить их на Map.

Запросить все пары с подсчетом из базы данных.

rs = db.getSM().executeQuery("SELECT company, feedback, COUNT(DISTINCT person) AS rowcount FROM predata GROUP BY company, feedback");

Создайте Map и пройдите через ResultSet чтобы сохранить счет.

HashMap<String, HashMap<String, Integer>> companyFeedbackMap = new HashMap<String, HashMap<String, Integer>>();
while (rs.next()) {
    String company = rs.getString("company");
    String feedback = rs.getString("feedback");
    Integer count = rs.getInt("rowcount");
    if(!companyFeedbackMap.contains(company)){
        companyFeedbackMap.put(company, new HashMap<String, Integer>());
    }
    companyFeedbackMap.get(company).put(feedback, count);
}

Чтобы получить счет компании Apple с Neutral обратной связью, просто используйте companyFeedbackMap.get("Apple").get("Neutral");//This will return 2 companyFeedbackMap.get("Apple").get("Neutral");//This will return 2.


OR, вместо HashMap<String, HashMap<String, Integer>>, вы можете создать собственную Company класс с названием компании, good, neutral и bad, как его конструктором атрибуты и хранить счетчик от шарнирного запросов SQL в ArrayList или что - нибудь вам это нужно

rs = db.getSM().executeQuery("SELECT company, SUM(good) AS good, SUM(neutral) AS neutral, SUM(bad) AS bad FROM (SELECT company, CASE WHEN feedback = 'Good' THEN 1 ELSE 0 END AS good, CASE WHEN feedback = 'Neutral' THEN 1 ELSE 0 END AS neutral, CASE WHEN feedback = 'Bad' THEN 1 ELSE 0 END AS bad FROM predata) GROUP BY company");
ArrayList<Company> companies = new ArrayList<Company>();
while (rs.next()) {
    String company = rs.getString("company");
    Integer good = rs.getInt("good");
    Integer neutral = rs.getInt("neutral");
    Integer bad = rs.getInt("bad");
    companies.add(new Company(company, good, neutral, bad));
}

Вышеприведенный sql вернет результат ниже.

Company      good        neutral    bad
------       --------    -------    -------
Apple        1           2          1
Orange       0           1          1
Pear         0           0          1
0
SELECT  Company, Feedback, COUNT(Feedback)
FROM t
GROUP BY Feedback
where Company='Apple';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню