主表
序号   班级 
1       文班
2       理班
..............
细表
序号   收费类别  金额
1       学费      400
1       内宿费    100
2       学费      80
2       内宿费    300请问如何实现如下的结果,班级分类不只是文班和理班,还有其它的班别 ?
收费类别  金额  文班 理班  ................
学费      480   400   80   ................
内宿费    400   100   300  ................ 则是把主表的班级的值变成列名

解决方案 »

  1.   

    一步无法实现
    必须用代码将数据搜集。至于虚拟表结构,可以使用TClientDataSet,它是内存表
      

  2.   

    如果班级固定,可以用case语句实现.
    如果不固定,可能只能写存储过程了.
    不过,如果你是做报表,可用交叉表,应该是最方便的.
      

  3.   

    你最好是能够给出表的具体结构
    如字段名等
    主表 a 细表 b ;
    select * 
    from  a,b 
    where  你 的条件!~~我试试在给你答复
      

  4.   

    给你一个例子:
    select distinct a.*,b.* from 主表 as a ,细表 as b where a.序号=b.序号 group by b.收费类别
      

  5.   

    我也遇到过这样的问题,建议用临时表处理。查询数据,由
    序号   班级 
    1       文班
    2       理班
    ..............得到临时表结构,
    创建临时表,给临时表添加字段如下:
    收费类别  金额  文班 理班  ................
    然后给临时表INSERT 
    'insert into temp (收费类别,金额,' + v1 + ') values ' + v2 + ''
    v1可由你的主表通过循环得到:
     v1 :=v1+  + Query1.Fields[i].AsString + ',';
    在循环外面作
      v1 := copy(v1, 1, length(v1) - 1);//去掉最后多余的“,”
     v2可由你的主表和细表通过循环得到
     v2 := '(' + '''收费类别'',''金额'''+ ',' + v3 + ')';
     v3由: v3 := v3 + '''' + Query2.Fields[i].AsString + ''','; 
      

  6.   

    要用存储过程分二步来实现。
    lllygang(老阿Q)说得对。
      

  7.   

    lllygang(老阿Q)  好!