在表格下方显示每个产品的总量

w1e3prcc  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(184)

我使用itextpdf来显示sql查询

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

我能够根据产品名称将表分开,并通过得到 sum(amt) over(partition by prod_name) as total_amt 从sql查询。现在,我试着把每种产品的总量显示如下:

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 .

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
nr9pn0ug

nr9pn0ug1#

在标准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代码就可以从查询中读取结果。

相关问题