Я пытаюсь выполнить анализ в определенной системе. Система должна выполнять анализ, запрашивая две или более таблиц из базы данных, а затем отображать общий результат, сгруппированный по полю.
Это система на основе Java, использующая SQL в качестве базы данных. Я пытался использовать UNION, UNION ALL, но это не дает удовлетворительных результатов.
Ниже приведена таблица 1.
id itemID ItemName entryTime
1 GAR001 PhoneAG ""
2 GAR004 PCLG ""
3 GAR009 ELECT ""
...
Ниже приведена таблица 2.
id itemID ItemName entryTime issuedate
1 GAR001 PhoneAG "" ""
2 GAR001 PhoneAG "" ""
3 GAR009 ELECT "" ""
...
Я попытался использовать следующее
public ObservableList<PieChart.Data> getItemAnalysis(){
ObservableList<PieChart.Data> data = FXCollections.observableArrayList();
String st1 = "SELECT itemID, COUNT(itemID) FROM table1 GROUP BY itemID UNION ALL SELECT itemID, COUNT(itemID) FROM table2 GROUP BY itemID";
System.out.println(st1);
ResultSet rs = execQuery(st1);
try{
if (rs.next()){
String itemId = rs.getString("itemID");
int count = rs.getInt(2);
data.add(new PieChart.Data(itemId + "(" + count + ")", count));
}
} catch (SQLException ex) {
Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
}
return data;
}
По возврату результата. Он возвращается
GAR001(1),
GAR004(1),
GAR009(1),
GAR001(2),
GAR009(1).
Я ожидаю, что возврат результата будет
GAR001(3)
GAR004(1)
GAR009(2)




Вы применяете union all между двумя сгруппированными запросами. Вместо этого вы должны union all необработанные данные, а затем сгруппировать их:
SELECT itemID, COUNT(*)
FROM (SELECT itemID
FROM table1
UNION ALL
SELECT itemID
FROM table2) t
GROUP BY itemID
Вы должны использовать подзапросы
SELECT DISTINCT itemID , COUNT(*) AS COUNT
FROM (SELECT itemID
FROM table1
UNION ALL
SELECT itemID
FROM table2) as T
GROUP BY itemID;
На самом деле вам нужно отредактировать оператор SQL, поэтому вы получаете такие результаты. @Mureinik опубликовал правильный SQL. Я пошел дальше и подключил это к вашему коду, чтобы дать вам решение, которое должно работать.
public ObservableList<PieChart.Data> getItemAnalysis(){
ObservableList<PieChart.Data> data = FXCollections.observableArrayList();
sql = "SELECT itemID, COUNT(*) FROM (SELECT itemID FROM table1 UNION ALL SELECT itemID FROM table2) t GROUP BY itemID"
System.out.println(sql);
ResultSet rs = execQuery(sql);
try{
if (rs.next()){
String itemId = rs.getString("itemID");
int count = rs.getInt(2);
data.add(new PieChart.Data(itemId + "(" + count + ")", count));
}
} catch (SQLException ex) {
Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
}
return data;
}
@Garande Я рад, что это сработало для тебя. Пожалуйста, отметьте этот ответ как «правильный», чтобы другие пользователи могли использовать его в будущем!
Большое спасибо .. Вы действительно спасли меня после многих бессонных ночей.