在 table 下方显示每个产品的总金额

Display the total amount of each products below the table

我正在使用 itextpdf 显示 sql 查询

SELECT prod_id, prod_name, amt, sum(amt) over(partition by prod_name) as total_amt
FROM items 
ORDER BY prod_name;

我能够根据 PROD_NAME 分离出 table,并通过从 sql 查询中获取 sum(amt) over(partition by prod_name) as total_amt 来计算每个产品的总金额。现在,我一直在尝试在下面显示每种产品的总量:

APPLE
PROD_ID | AMT
11111     12.75
22222     13.75
33333     14.75
Total:    41.25

ORANGE
PROD_ID | AMT
44444     15.75
55555     16.75
Total:    32.5   

但是,这是我的代码的输出。每行后显示总金额。

APPLE
PROD_ID | AMT
11111     12.75
Total:    41.25
22222     13.75
Total:    41.25
33333     14.75
Total:    41.25

ORANGE
PROD_ID | AMT
44444     15.75
Total:    32.5
55555     16.75
Total:    32.5 

这是我的代码片段:

List<String> prod_Names = new ArrayList<>();
 
while(rs.next()){
    String prodName = rs.getString(2);
    
    if (!prod_Names.contains(prodName)){
        prod_Names.add(prodName);
        
        // Displays the Product Name on top of the table
        PdfPCell name = new PdfPCell(new Phrase(prodname, bold));
        name.setColspan(2);
        prod_Table.addCell(name);
       
        // Displays the Row Header     
        prod_Table.addCell(new Phrase("PROD_ID", header_Bold));
        prod_Table.addCell(new Phrase("AMT", header_Bold));
    }
        
    String prodId_Values = result.getInt(1);
    int amt_Values = result.getInt(3);  // amount
    int totalAmt = result.getInt(4);    // total amount of each products
    
        
    //Displays the  Values
    prod_Table.addCell(new Phrase(Integer.toString(prodId_Values), normalFont));
    prod_Table.addCell(new Phrase(Integer.toString(amt_Values), normalFont));
    
    // Display Total
        prod_Table.addCell(new Phrase("TOTAL:", normalFont));
        prod_Table.addCell(new Phrase(Integer.toString(totalAmt), normalFont));
    
}

我尝试将 Display Total 行放在 if 条件中,就像我对产品名称所做的那样。我还添加了另一个名为 prod_Names2.

的 ArrayList
if(!prod_Names2.contains(prodName)){
 prod_Names2.add(prodName);

 // Display Total
 prod_Table.addCell(new Phrase("TOTAL:", normalFont));
 prod_Table.addCell(new Phrase(Integer.toString(totalAmt), normalFont));

}

现在总金额只显示一次,而是像这样每行显示一次。这是我能做的最好的事情:

APPLE
PROD_ID | AMT
11111     12.75
Total:    41.25
22222     13.75
33333     14.75


ORANGE
PROD_ID | AMT
44444     15.75
Total:    32.5
55555     16.75   

在标准 SQL 中,您可以使用 grouping sets:

做您想做的事
SELECT prod_id, prod_name, SUM(amt) as amt
FROM items 
GROUP BY GROUPING SETS ( (prod_id, prod_name), () )
ORDER BY prod_name NULLS LAST;

并非所有数据库都完全支持这种语法,但大多数都支持它的一些变体。然后您的 java 代码可以只读取查询的结果。