我有一个数据表是 成绩表(学号+姓名+课程号+学期+成绩+标志+班级)
标志:是说是正常考试还是补考
现在我想(输入班级)打印全班全部科目成绩,不用打印学期和标志,成绩不用分类了,正常考试不及格的打印补考成绩,这个报表怎么做,怎么用SQL语句查询
查询成什么格式,请详细些说,我不太懂报表。
PS:小弟忙了很长时间了,可是总是搞不出来,已经拖了很长时间了,这周老师要要了
不能再拖了,请各位大狭帮帮忙,谢了。分不够可以再加。因等级不够,分贴给分

解决方案 »

  1.   

    不好意思,等我把手术室这块弄完再写吧。:)有时间上www.playicq.com 下些例子看看。看多了就会了。 
      

  2.   

    完全依靠sql实现我不会,如果sql结合编程那就应该不太难了。
    老兄你先做着啊,中间过程有什么问题再拿来问嘛。
      

  3.   

    想用fastreport和SQL但是怎么也做不出来,急死我了
    还是CSDN好,DFW上一个人回复都没有
      

  4.   

    你这个问题转到sql版,大力,蚂蚁,他们不到5分钟就会帮你解决问题, 但这个问题你自己先想过没有,有没有自己的解决办法,拿出来给大家看看,有个例子,好让人家帮你改。
      

  5.   

    我觉得你应该先想怎么把
    001 tom   maths   1 85 0 1
    001 tom   english 1 65 0 1
    001 tom   physics 1 75 0 1
    002 jerry maths   1 65 0 1
    002 jerry english 1 85 0 1
    002 jerry physics 1 75 0 1
    .................
    转为
    001 tom   85 65 75
    002 jerry 65 85 75
    .............
    然后就万事大吉了
      

  6.   

    --这里‘偷’了个关于行列转换的语句,看看应该有帮助!
    declare @sql varchar(8000)
    set @sql = 'select '
    select @sql = @sql + 'sum(case 课程号 when '''+课程号+''' 
                              then 成绩 else 0 end) as '+课程号+',' 
          from (select distinct 课程号 from 成绩表) as a
    select @sql = left(@sql,len(@sql)-1) + ' from 成绩表'
    exec(@sql)
    go
      

  7.   

    select a.学号,a.姓名,a.课程号,case a.成绩<60 then b.成绩 else b.成绩 end)成绩,班级 from (select 学号,成绩 from 表 where 标志='正常')a
     left join (select 学号,成绩 from 表 where 标志='补考')b
    where a.学期='你要的学期'
      

  8.   

    第一步:
    得到该班有几个科目,为每个科目创建一个临时视图(用完可以删掉)
    create view 课程名称1 as
    select id,学分,学时,成绩,任课教师
    from 成绩基本表
    where 
    "班级"="班级"
    and "学期"="学期"
    and "学年"="学年"
    .
    create view 课程名称2 as
    select id,学分,学时,成绩,任课教师
    from 成绩基本表
    where 
    班级=班级
    and 学期=学期
    and 学年=学年


    有多少个科目就建立多少个这样的试图(程序中建立)第二步:
    建立一个与报表样子类似的视图(也在程序中建立,临时的,用完可以删掉)
    create view 成绩临时 as
    select ID,学号,姓名,性别,课程名称1.学分,课程名称1.学时,课程名称1.成绩,课程名称1.任课教师,.......有多少个课程就有多少个字段
    from 成绩基本表,
    where 
    班级=班级
    and 学期=学期
    and 学年=学年
    left join 课程名称1(视图) on 课程名称1(视图).id=成绩基本表.id
    有多少个课程就JOIN多少次第三步,前面的工作已经把打印的数据源都准备好了。接下来你可以用一个
    TADOQUERY将视图(成绩临时)的所有数据读出来,再在QUICQREP里根据科目的
    数量建立TQRDBTEXT控件,并设置他的关键属性(代码中)
    完成。
    另外你提到就是学期的问题。如果你已经知道某个学期成绩的科目的话那做法
    比这更简单。连视图都不要键了。只要写一个复杂点的查询语句就可以了
    以上是我的做法,你自己在考虑一下!!
      

  9.   

    --试试我的好吗
    declare @sql varchar(8000)
    set @sql = 'select 姓名,'
    select @sql = @sql + ' sum(case 课程号 when '''+课程号+''' 
                              then 成绩 else 0 end) as '+课程号+',' 
            from (select distinct 课程号 from 成绩表) as aselect @sql = left(@sql,len(@sql)-1) +
     ' from (select a.学号,a.姓名,a.课程号,(case when a.成绩<60 then b.成绩 else a.成绩 end)成绩,班级 
            from (select * from 成绩表 where 标志=0) as  a
             left join (select 学号,成绩 from 成绩表 where 标志=1) as b on a.学号 = b.学号
            where a.班级=1 ) as a group by  姓名'
    ~~~~~~~~~~1~~~~~~~~~~~~~~
                      你输入的班级号
    exec(@sql)go
      

  10.   

    如果想要的表结构如下:
    班级 学号 课程号 成绩可以用这条语句:
    select * from t
    (select 班级,学号,课程号,if(成绩>60,if(标志=正常考试,成绩,成绩),if(标志=补考,成绩,-1))
    from 成绩基本表 
    ) t
    where 成绩<> -1
    用这种方法选出来记录后按照班级 学号 课程号排序,就可以了。
      

  11.   

    select 学号,姓名,课程号,成绩 from (
    select 学号,姓名,课程号,成绩  from 成绩表 
     where 班级 = @bj 
     and 成绩 >= 60 
     and 标志 = '正常考试'
    union all
    select 学号,姓名,课程号,成绩  from 成绩表 
     where 班级 = @bj 
     and 标志 = '补考') as A
    order by A.学号,A.课程号
      

  12.   

    交叉数据报表
    有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable&reg;、创建交叉数据报表或旋转数据。假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:Year      Quarter      Amount
    ----      -------      ------
    1990      1           1.1
    1990      2           1.2
    1990      3           1.3
    1990      4           1.4
    1991      1           2.1
    1991      2           2.2
    1991      3           2.3
    1991      4           2.4生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:Year
     Q1
     Q2
     Q3
     Q4
     
    1990
     1.1
     1.2
     1.3
     1.4
     
    1991
     2.1
     2.2
     2.3
     2.4
     
    下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:USE Northwind
    GOCREATE TABLE Pivot
    ( Year      SMALLINT,
      Quarter   TINYINT, 
      Amount      DECIMAL(2,1) )
    GO
    INSERT INTO Pivot VALUES (1990, 1, 1.1)
    INSERT INTO Pivot VALUES (1990, 2, 1.2)
    INSERT INTO Pivot VALUES (1990, 3, 1.3)
    INSERT INTO Pivot VALUES (1990, 4, 1.4)
    INSERT INTO Pivot VALUES (1991, 1, 2.1)
    INSERT INTO Pivot VALUES (1991, 2, 2.2)
    INSERT INTO Pivot VALUES (1991, 3, 2.3)
    INSERT INTO Pivot VALUES (1991, 4, 2.4)
    GO下面是用于创建旋转结果的 SELECT 语句:SELECT Year, 
        SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
        SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
        SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
        SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
    FROM Northwind.dbo.Pivot
    GROUP BY Year
    GO该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
    FROM (SELECT Year,
                 SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
                 SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
                 SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
                 SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
         FROM Pivot AS P
         GROUP BY P.Year) AS P1
    GO带有 CUBE 的 GROUP BY 和带有 ROLLUP 的 GROUP BY 都计算与本例显示相同的信息种类,但格式稍有不同。
      

  13.   

    create table #1 (姓名 varchar(10),科目 varchar(10),成绩 int)insert #1 values('小刚','语文',90)
    insert #1 values('小刚','数学',80)
    insert #1 values('小刚','英语',90)
    insert #1 values('小强','语文',56)
    insert #1 values('小强','数学',98)
    insert #1 values('小强','英语',78)SELECT 姓名, 
        SUM(CASE 科目 WHEN '语文' THEN 成绩 ELSE 0 END) 语文,
        SUM(CASE 科目 WHEN '数学' THEN 成绩 ELSE 0 END) 数学,
        SUM(CASE 科目 WHEN '英语' THEN 成绩 ELSE 0 END) 英语
    FROM #1
    GROUP BY 姓名drop table #1
      

  14.   

    或:create table #1 (姓名 varchar(10),科目 varchar(10),成绩 int)insert #1 values('小刚','语文',90)
    insert #1 values('小刚','数学',80)
    insert #1 values('小刚','英语',90)
    insert #1 values('小强','语文',56)
    insert #1 values('小强','数学',98)
    insert #1 values('小强','英语',78)declare @sql varchar(8000)
    set @sql = 'select 姓名,'select @sql = @sql + 'sum(case 科目 when '''+科目+''' 
                              then 成绩 else 0 end) as '''+科目+''','
      from (select distinct 科目 from #1) as aselect @sql = left(@sql,len(@sql)-1) + ' from #1 group by 姓名'exec(@sql)
    drop table #1
      

  15.   

    先说用什么做?具体一点,我可能有现成的。
    我的email:[email protected]助人乃快乐之本
      

  16.   

    我好有点不明白,用存储过程查出了数据,并且成了交叉报表格式了,向上面的
    newdongkui(老乌鸦) 和 pengdali(大力) 写的
    这样在FR中还要用交叉报表吗