Как запросить две таблицы с похожими данными и сгруппировать результат по полю таблицы в JAVA?

Я пытаюсь выполнить анализ в определенной системе. Система должна выполнять анализ, запрашивая две или более таблиц из базы данных, а затем отображать общий результат, сгруппированный по полю.

Это система на основе 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)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
48
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы применяете union all между двумя сгруппированными запросами. Вместо этого вы должны union all необработанные данные, а затем сгруппировать их:

SELECT   itemID, COUNT(*)
FROM     (SELECT itemID
          FROM   table1
          UNION ALL
          SELECT itemID
          FROM   table2) t
GROUP BY itemID

Большое спасибо .. Вы действительно спасли меня после многих бессонных ночей.

Garande 09.04.2019 00:07

Вы должны использовать подзапросы

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 Я рад, что это сработало для тебя. Пожалуйста, отметьте этот ответ как «правильный», чтобы другие пользователи могли использовать его в будущем!

artemis 09.04.2019 05:44

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