日期:2014-05-20  浏览次数:20851 次

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 子句中所指定的聚合函数的合计。