大家好,我在开发报表中有碰到下面的问题,我写了一个方法,如下所示:
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;
}
其中传入的查询语句是: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方法进行改变,不知道大家没有什么样的好办法?请指教!谢谢,大家以后也许有会有此需求!

解决方案 »

  1.   

    在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 子句中所指定的聚合函数的合计。 
    COMPUTE 用法示例
    下列 SELECT 语句使用简单 COMPUTE 子句生成 titles 表中 price 及 advance 的求和总计:USE pubs
    SELECT type, price, advance
    FROM titles
    ORDER BY type
    COMPUTE SUM(price), SUM(advance)下列查询在 COMPUTE 子句中加入可选的 BY 关键字,以生成每个组的小计:USE pubs
    SELECT type, price, advance
    FROM titles
    ORDER BY type
    COMPUTE SUM(price), SUM(advance) BY type此 SELECT 语句的结果用 12 个结果集返回,六个组中的每个组都有两个结果集。每个组的第一个结果集是一个行集,其中包含选择列表中所请求的信息。每个组的第二个结果集包含 COMPUTE 子句中两个 SUM 函数的小计。说明  一些实用工具(如 osql)显示多个小计或合计聚合汇总的方式可能会使用户以为每个小计都是结果集中的单独一行。这是由于该实用工具设置输出格式的方式;小计或合计聚合返回时单独占用一行。其它应用程序(如 SQL 查询分析器)将多个聚合设置在同一行。
    比较 COMPUTE 和 GROUP BY
    COMPUTE 和 GROUP BY 之间的区别汇总如下: GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。
    COMPUTE 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 SELECT 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中。 
    下列查询使用 GROUP BY 和聚合函数;该查询将返回一个结果集,其中每个组有一行,该行中包含该组的聚合小计:USE pubs
    SELECT type, SUM(price), SUM(advance)
    FROM titles
    GROUP BY type说明  在 COMPUTE 或 COMPUTE BY 子句中,不能包含 ntext、text 或 image 数据类型。请参见
      

  2.   

    楼上的用一条SQL语句能得到下面的结果吗?
    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
      

  3.   

    LZ说的可以用COMPUTE BY得到,但是返回的是多个结果集,用JDBC还是要分开处理的
      

  4.   

    难道就没有谁能用JAVA来重新生成这个LIST吗?看来大家还是只限于SQL中啊!
    说实话用JDBC分开处理也不能达到我上面的要求吧!请大家在想想,或者重组DataTable是否更好呢?在此请教大家啦!分数还没有散发出去了,不知道能不能发出去帖子分数哦.......
      

  5.   

    可以用Java生成list来做,但要多查一次sql来做统计。
    留下你的qq或邮箱,给你一段代码你就知道了
      

  6.   

    嗯,是的,谢谢yangyijieyyj的楼主,我的email:[email protected]
      

  7.   

    合计可以不用处理:如下结果所示,supp_name          order_code          yd_money          sh_money  
    上海永忻经贸有限公司                                 
    上海永忻经贸有限公司  212007092100010     500                400  
    上海永忻经贸有限公司  212007092100012     500                400  
    小计                                                    1000               800  
    上海天子君子有限公司                  
    上海天子君子有限公司  212007092100011     300                200  
    上海天子君子有限公司  212007092100013     300                200    
    小计                                                    600                400   
    主要是处理LIST的方法,谁有没有好的意思!送分啰!大家快来回答啊!
      

  8.   

    返回的是多个结果集
    我是用借尸还原的方法
                  List list1= (List)new java.util.ArrayList();
          Integer idsp =0;
          ids=idsp.longValue();
          Iterator itp =list.iterator();
            while (itp.hasNext()){
                                    ids=ids+1;
             Lei ms1=new Lei();
             Object[] results=(Object[])itp.next();
             ms1.setType(results[0].toString());
             ms1.setPrice(Long.valueOf(results[1].toString()));
             ms1.setAdvance(Long.valueOf(results[2].toString()));
             ms1.setId(ids);
             list1.add(ms1);
            }
            list2=list1;
      

  9.   

    lu_jiang同志的是什么东西班啊,乱写的吧!
    我想如果通过一条查询语句生成的List列表,然后在通过分组分割成多个list列表(其中这个list列表就可以用来计算的)
    ,然后生成CoputerList的列表,
    最后所有CoputerList列表记录累加上后生成所合要求的AllList列表,这样是不是更好呢?不过有这想法,
    但不知如何来实现!