我使用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
1条答案
按热度按时间nr9pn0ug1#
在标准sql中,您可以使用
grouping sets
:并非所有数据库都支持这种语法,但大多数数据库都支持这种语法的一些变体。然后java代码就可以从查询中读取结果。