Я пытаюсь найти запрос 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"));
Этот метод работает для меня, но я пытаюсь сократить весь код, не повторяя код снова и снова
Вы можете запросить все пары обратной связи между компаниями и сохранить их на 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
SELECT Company, Feedback, COUNT(Feedback)
FROM t
GROUP BY Feedback
where Company='Apple';
SELECT Company, Feedback, COUNT(*) FROM TableName GROUP BY Company;
WHERE Company = 'Apple' GROUP BY Feedback;