我的数据库是sql2000,语言是delphi.存在一个数据表:table1,字段有id,车牌,司机,运输货物量。
id为主键, 
车牌,司机 为string类型,运输货物量为int型数据,有六条记录 意思是两个司机用2个车送货,A1载1吨,A2载2吨.统计每个司机的送货量
id   司机  车牌   配送货物量
1    sj1    A1      1 
2    sj1    A1      1    
3    sj1    A2      2
4    sj2    A1      1
5    sj2    A2      2
6    sj2    A2      2
我想在界面上用dbgrideh控件显示数据如下:
     司机   车牌  运输货物量
     sj1    A1      2
            A2      2
                    4
     sj2    A1      1
            A2      4
                    5
     总计           9意思是 sj1送了4吨货物 sj2送了5吨货物, 总计送了9吨货物。
请教大家我想实现的目的能达到吗?感觉挺复杂的,请大家帮忙了,十分感谢!!!

解决方案 »

  1.   

    参考sqlserver里面的group by rollup,这个可以生成小计和总计
      

  2.   

    /*
    用 ROLLUP 汇总数据在生成包含小计和合计的报表时,ROLLUP 运算符很有用。
    ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。
    CUBE 和 ROLLUP 之间的区别在于: CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
    ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。 例如,简单表 #t
    中包含:Item Color Quantity
    */
    select [Item]=case when grouping([Item])=1 then 'ALL' else isnull(Item, 'UNKNOWN')end,
    [Color]=case when grouping([Color])=1 then 'ALL' else isnull([Color],'UNKNOWN')end,
    sum([Quantity])[Quantity]
    from #t group by [Item],[Color] with rollup
    /*
    Item Color Quantity
    ----- ----- -----------
    Chair Blue 101
    Chair Red 210
    Chair ALL 311
    Table Blue 124
    Table Red 223
    Table ALL 347
    ALL ALL 658 
      

  3.   

    用cxGrid或者dxGrid会方便一点!
    或者使用联合查询来构造数据集来显示!
      

  4.   

    学习。
    回去试试看。
    不过,我通常也是用cxGrid处理。
    或者,直接写到StringGrid中。
      

  5.   

    select 
        case when grouping(司机)=1 then '总计' else isnull(司机,'') end 司机, 
        case when grouping(车牌)=1 and grouping(司机)=0 then '' else isnull(cast(车牌 as varchar),'') end 车牌, 
        sum(配送货物量) as 配送货物量
    from 
       tb 
    group by 
       司机,车牌 
    with rollup 
    声明:这个是高手答的
    把这个整到delphi中你会吧?
      

  6.   

      adoquery2.Close;
      adoquery2.SQL.Clear;
      adoquery2.SQL.Add('select case when grouping(司机)=1 then ''总计'' else isnull(sj,'''') end 司机,');
      adoquery2.SQL.Add('case when grouping(车牌)=1 and grouping(司机)=0 then ''小计'' else isnull(cast(车牌 as varchar),'''') end 车牌,');
      adoquery2.SQL.Add('sum(配送货物量) from table1 group by 司机,车牌 with rollup');
      adoquery2.Open;
    以上是delphi代码在sql-server2000+delphi7环境下测试通过。