我有表a如下: 学号    竞赛科目    成绩  (其中竞赛科目为列表框组件,包含语文,数学,英语)
             001       语文       72
             001       英语       64
             002       数学       71我的想法是:上面的表显示在dbgrid中,然后通过按钮点击,在组件stringgrid中显示成如下内容             学号      语文    数学     英语
             001        72               64
             002                71          数据库用的是sql 2000,刚刚学delphi,请高手指点下小弟,最好能提供详细的实例,感谢,另外如果我想新增个科目如物理之类的,应该要怎么做呢?

解决方案 »

  1.   

    select 学号, 
      max(case 竞赛科目 when '语文' then 成绩 else 0 end) 语文, 
      max(case 竞赛科目 when '数学' then 成绩 else 0 end) 数学, 
      max(case 竞赛科目 when '物理' then 成绩 else 0 end) 物理, 
    from tb 
    group by 学号
      

  2.   


    正解,如果没有同一科目的多条记录,可以不用max
      

  3.   


    请问一下,'max' 的作用是什么?
      

  4.   

    点击按钮,得到结果集,再把结果集写进stringgrid里不就行了?
      

  5.   

    max主要用来是配合group by.也可以不用max这个聚合函数
      

  6.   


    dinoalex 
    你好,现在有了一点眉目,只是我只会把结果集写进另外一个dbgrid里面,stringgrid不会操作,具体要写进去,是不是还要写个循环,一个个的添加?
    能给个与stringgrid关联的语句吗?
      

  7.   

    for i:= 0 to adoquery1.fieldcount -1 do
      stringgrid1.cell[i,0]:= adoquery1.fields[i].fieldname; //加表头
    r:= 1;
    while not adoquery1.eof do
      begin
        for i:= 0 to adoquery.fieldcount -1 do
          stringrid1.cell[i,r]:= adoquery1.fields[i].asstring;
        inc(r);
      end大致是这样吧,手写,没测,你自己测吧
      

  8.   

    这个我倒是会写,但是这样的话,就得用到两个dbgrid,一个stringgrid, 因为这样循环赋值是取的第二个数据集dbgrid里面的数据,这样还有个问题,如果想新增列的话,还可不可行。能不能只用一个dbgrid,一个stringgrid呢,如果这样的话,赋值语句就要换了。
      

  9.   

    不是两个dbgrid.是两个adoquery,新增列? 加什么列?在stringgrid里加的话,直接赋值就行了,如果在数据库里的话,那要看你是的是什么列的,那个SQL语句是根据竞赛科目来写的,里面有多少个,你就写多少个
      

  10.   

    再问个白痴的问题,这个sql语句应该要放在哪里?
      

  11.   

    不管用SQL还是语句,这问题都是容易的.楼主要加油了.