我有三张表:
学生(Tstudent): 
      stud_id stud_name
       1         小张
       ..........
科目(Tcourse): 
      cour_id cour_name
         1     语文
         ...
Tselecourse:
       sele_stud_id sele_cour_id sele_score(分数)
           1          1            80我的存储过程:
create procedure sp_executesql 
as
declare variable SQLString varchar(4000);
declare variable temp_courid integer;
declare variable temp_courname char(40);
begin
declare cursor_xkb cursor for select distinct 
  sele_cour_id,cour_name from tselecourse ,tcourse where
  tselecourse.sele_cour_id = tcourse.cour_id;
  /* Procedure Text */
  SQLString = N'select stud_name 学生姓名,';
  open cursor_xkb;
  fetch cursor_xkb into temp_courid, temp_courname;
  while(!SQLCODE)
  {
    SQLString = SQLString + N'sum(case sele_cour_id when '
    + cast(temp_courid as varchar) + N'then sele_scor end) as "'
    + temp_courname +'",';
    fetch cursor_xkb into temp_courid, temp_courname;
  }
  close cursor_xkb;
  SQLString = left(SQLString,length(SQLString)-1);
  SQLString = SQLString + N' from tselecourse,tstudent 
  where tselecourse.sele_cour_id = tstudent.stud_id group by tstudent.stud_name';
  execute sp_executesql SQLString
  suspend;
end我刚学interbase,有很多不懂,请大家帮我看一看

解决方案 »

  1.   

    你的意思是科目是动态的是不是啊?没有用过interbase,我只能提供sql server的语句,不过感觉差不多,你看着改一下,呵呵。
    跟这个问题http://expert.csdn.net/Expert/topic/2696/2696160.xml?temp=.7145044有点类似,在那个问题里面我是建表做过测试并且成功的。你这里只是又多了一个关联表而已,在下列语句中用left join来体现这个多出来的关联declare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + ' sum(case when sele_cour_id = ' + convert(varchar(20), cour_id) +
      ' then sele_score else null end) as ' + cour_name + ','
    from TCourse --这里根据科目表取所有科目set @sql = 'select tmp.*, t1.stud_name 
      from (select ' + @sql + ' sele_stud_id
      from table1
      group by sele_stud_id) tmp 
      left join Tstudent t1
      on t1.stud_id = tmp.sele_stud_id '
    exec(@sql)
      

  2.   

    SQL-server 我也知道
    我就是不能把它转成interbase 的,那位高手能帮一下
    我从网上查到interbase 不能直接做出动态交叉表,先得做
    一个临时试图:>>  > > 一客户销售表,输入数据后排列为: 
    >>  > > STYLE  COLOR CLIENT  sale_quantity, sale_date 
    >>  > > SW001  红色  001     100           2003-5-6 
    >>  > > SW001  黑色  002     200           2003-5-6 
    >>  > > SW002  白色  001     50            2003-5-6 
    >>  > > SW002  黄色  002     50            2003-5-6 
    >>  > > SW001  红色  001     25            2003-5-8 
    >>  > > SW003  蓝色  002     15            2003-5-8 
    >>  > > SW001  黑色  001     100           2003-5-6 
    >>  > > SW003  白色  001     20            2003-5-10 
    >>  > > .. . 
    >>  > > . . 
    >>  > > 客戶數量,颜色不確定,是動態的。 
    >>  > >  
    >>  > > 現在是要將每个客户销售数量,款式,颜色汇总后的顯示結果排為 
    >>  > >  STYLE    color  001  002   。。
    >>  > >  SW001     红色  125  0
    >>  > >  SW001     黑色  100  200 
    >>  > >  SW002     白色  50   0         
    >>  > >  SW002     黄色  0    50                      
    >>  > >  SW003     蓝色  0    15           
    >>  > >  SW003     白色  20   0         
    利用堂主的方法略修改后如下:
    CREATE PROCEDURE PROC_20031224_DC_QUERY 
    AS
    DECLARE VARIABLE H_C VARCHAR(12);(堂主的原是INTEGER)
    DECLARE VARIABLE I INTEGER;
    DECLARE VARIABLE HC_STR VARCHAR(2000);
    DECLARE VARIABLE H_MOD VARCHAR(3);
    DECLARE VARIABLE H_N VARCHAR(12);
    BEGIN
       /*
       * 判断视图 VIEW_20031224_DC_QUERY 是否存在,
       * 如果存在,将其删除
       */
      IF (EXISTS (SELECT RDB$RELATION_NAME
                   FROM RDB$RELATIONS
                   WHERE RDB$RELATION_NAME='VIEW_200_DC_QUERY'))
      THEN BEGIN
          EXECUTE STATEMENT 'DROP VIEW "VIEW_200_DC_QUERY"';
      END  /*
       * 确定客户数量
       */  HC_STR='CREATE VIEW "VIEW_200_DC_QUERY" (STYLE,COLOR';
      H_MOD=';
      for SELECT DISTINCT CLIENT FROM SALEDETAIL INTO :H_C do/*△△△△*/
      begin
        /*生成客户字段*/
        HC_STR=HC_STR||','||:H_C;/*☆☆☆☆*/
      END
      HC_STR=HC_STR||') AS SELECT MAX(STYLE),MAX(COLOR)';
      H_MOD=';
      FOR SELECT DISTINCT CLIENT
          FROM ORDERDETAIL
          ORDER BY CLIENT
          INTO :H_N
      DO
      BEGIN
      /*
       * 统计销售数量
       */
      H_MOD=',';
      HC_STR=HC_STR||H_MOD||'SUM(CASE CLIENT WHEN '' ||:H_N||'' THEN SAKE_QUANTITY ELSE 0 END) AS C_SALE'||CAST(I AS VARCHAR(2));
      I=I+1;
      END
      HC_STR=HC_STR||' FROM SALEDETAIL GROUP BY STYLE,COLOR';
      /*
       * 生成新的动态视图
       */
      EXECUTE STATEMENT HC_STR;
      EXIT;
    END
    但我还是调试不通过.
    请大家帮帮忙
    先谢谢了
      

  3.   

    说句题外话,楼主你说在学习interbase,不是要拿它来做应用吧?interbase好像已经停止研发,只是出于维护阶段了吧?个人觉得如果是为了学习的话,还是学sql server和oracle这些主流数据库算了:)
      

  4.   


    没办法`
    用到了interbase临时学学