Как объединить кортежи с повторяющимися атрибутами в один кортеж? - PullRequest
0 голосов
/ 23 апреля 2020

Я создал класс java с тем же именем, что и таблица из базы данных SQL, и, используя извлеченную информацию из этой таблицы, я создал несколько объектов из этого класса Java и сохранил их внутри ArrayList ,

CREATE TABLE `orderdetails` (
  `orderNumber` int(11) NOT NULL,
  `productCode` varchar(15) NOT NULL,
  `quantityOrdered` int(11) NOT NULL,
  `priceEach` decimal(10,2) NOT NULL,
  `orderLineNumber` smallint(6) NOT NULL,
  PRIMARY KEY (`orderNumber`,`productCode`),
  KEY `productCode` (`productCode`),
  CONSTRAINT `orderdetails_ibfk_1` FOREIGN KEY (`orderNumber`) REFERENCES `orders` (`orderNumber`),
  CONSTRAINT `orderdetails_ibfk_2` FOREIGN KEY (`productCode`) REFERENCES `products` (`productCode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

кортежи имеют повторяющиеся порядковые номера, например:

(10100,'S18_1749',30,'136.00',3),

(10100,'S18_2248',50,'55.09',2),

(10100,'S18_4409',22,'75.46',4),

Каждый кортеж затем превращается в java объект класса с тем же именем, что и таблица, и храниться в Arraylist.

public ArrayList<OrderDetails> getOrders(String tableName) throws SQLException{
        ArrayList<OrderDetails>od=new ArrayList<OrderDetails>();

        try {
            String query="SELECT * FROM "+tableName;
            Statement s= con.createStatement();
            ResultSet rs= s.executeQuery(query);

            while(rs.next()) {

                int orderNumber=rs.getInt("orderNumber");
                String productCode=rs.getString("productCode");
                int quantityOrdered=rs.getInt("quantityOrdered");
                double priceEach=rs.getDouble("priceEach");
                int orderLineNumber=rs.getInt("orderLineNumber");

                OrderDetails temp=new OrderDetails(orderNumber, productCode, quantityOrdered, priceEach, orderLineNumber);
                od.add(temp);

            }

        }
        catch(SQLException e) {

            System.out.println("SQL exception happened while retriving data, close connection");

            throw new RuntimeException(e);  
        }
        return od;
    }

Я пытаюсь L oop через ArrayList и вывести общую сумму значения (priceEach times Кол-воOrdered) для каждого checkNumber. Но если я просто просто oop через ArrayList один объект за объектом, это не сработает. Поскольку я просто увижу сумму для каждого объекта, а не каждого checkNumber, на консоли.

ArrayList<OrderDetails>od= this.getOrders("orderdetails");
for(int i=0;i<=od.size();i++) {
         System.out.println(od.get(i).getPriceEach()*od.get(i).getQuantityOrdered());

     }

Я ожидаю, что что-то подобное появится на консоли (без повторяющегося checkNumber)

CheckNumber 10100, total value: 8494.62 (if you add up the product between priceEach and quantityOrdered for the three tuples shown above earlier in my question is the rsult)

Короче говоря, есть ли способ объединить объекты с повторяющимися атрибутами в один? Я прошу прощения, если мой вопрос кажется очень расплывчатым, и вы не знаете точно, в чем проблема. Буду очень признателен, если вы попытаетесь связаться со мной и попросить дальнейших разъяснений, иногда очень трудно описать проблему, которая слишком конкретна c ..

1 Ответ

1 голос
/ 23 апреля 2020

Почему бы просто не сделать вычисления в базе данных? SQL - это язык на основе множеств, который очень эффективен для операций такого типа по сравнению с итеративным l oop в Java.

Рассмотрим следующий агрегированный запрос:

select orderNumber, sum(quantityOrdered * priceEach) totalValue
from mytable
group by orderNumber

Это дает вам одну запись на заказ с общим значением по всем соответствующим строкам.

...