List 的重组,报表统计中使用!
大家好,我在开发报表中有碰到下面的问题,我写了一个方法,如下所示:
Java code
public List excuteView(String sqlString) throws Exception{
List<Map> rsList = new ArrayList<Map>();
Map<String,Object> row;
try{
Connection con= Pool.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sqlString);
ResultSetMetaData rsmd = rs.getMetaData();
int intColumnCount = rsmd.getColumnCount();
while(rs.next())
{
row = new HashMap<String,Object>(intColumnCount);
for(int i = 1; i<=intColumnCount;i++)
{
row.put(rsmd.getColumnName(i).toLowerCase(),rs.getObject(i));
}
rsList.add(row);
}
rs.close();
con.close();
}catch (Exception e) {
throw new Exception("查询不成功。" + e.getMessage());
}
return rsList;
}
其中传入的查询语句是:
SQL code
select c.name as supp_name,a.order_code,a.yd_number*a.price as yd_money,a.number*a.price as sh_money from kc_cgsh_order_list as a,kc_cgsh_order as b,kc_supplier as c,all_materiel as d where a.order_code=b.code and b.supplier_code=c.code and a.materiel_code=d.code order by c.code
调用上面的方法可以得到如下表1所示:
supp_name order_code yd_money sh_money
上海永忻经贸有限公司 212007092100010 500 400
上海永忻经贸有限公司 212007092100012 500 400
上海天子君子有限公司 212007092100011 300 200
上海天子君子有限公司 212007092100013 300 200
我得到上面的列表LIST,所以我想得到如下处理过的LIST的列表,其中对yd_money和sh_money进行小计和总计,按供应商名称来来分组显示的,显示结果如下表2所示:
supp_name order_code yd_money sh_money
上海永忻经贸有限公司
上海永忻经贸有限公司 212007092100010 500 400
上海永忻经贸有限公司 212007092100012 500 400
小计 1000 800
上海天子君子有限公司
上海天子君子有限公司 212007092100011 300 200
上海天子君子有限公司 212007092100013 300 200
小计 600 400
此行为空行
合计 1600 1200
也就是说我想得处理过后的表2显示情况,实际也是对上面的JAVA方法进行改变,不知道大家没有什么样的好办法?请指教!谢谢,大家以后也许有会有此需求!
------解决方案--------------------在SQL语句里有COMPUTE BY 能满足你的要求.
用 COMPUTE 和 COMPUTE BY 汇总数据
提供 COMPUTE 和 COMPUTE BY 是为了向后兼容。请改为使用下列组件:
Microsoft® SQL Server? 2000 Analysis Services 和用于 Analysis Services 的 OLE DB 或 Microsoft ActiveX® 数据对象(多维)(ADO MD) 一起使用。有关更多信息,请参见 Microsoft SQL Server? 2000 Analysis Services。
ROLLUP 运算符。有关更多信息,请参见用 ROLLUP 汇总数据。
COMPUTE BY 子句使您得以用同一 SELECT 语句既查看明细行,又查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值。
COMPUTE 子句需要下列信息:
可选的 BY 关键字,该关键字可按对一列计算指定的行聚合。
行聚合函数名称;例如,SUM、AVG、MIN、MAX 或 COUNT。
要对其执行行聚合函数的列。
COMPUTE 生成的结果集
COMPUTE 所生成的汇总值在查询结果中显示为分离的结果集。包括 COMPUTE 子句的查询的结果类似于控制中断报表,即汇总值由指定的组(或称中断)控制的报表。可以为各组生成汇总值,也可以对同一组计算多个聚合函数。
当 COMPUTE 带有可选的 BY 子句时,符合 SELECT 条件的每个组都有两个结果集:
每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。
每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。
当 COMPUTE 不带可选的 BY 子句时,SELECT 语句有两个结果集:
每个组的第一个结果集是包含选择列表信息的所有明细行。
第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。