我有一个数据表是 成绩表(学号+姓名+课程号+学期+成绩+标志+班级)
标志:是说是正常考试还是补考
现在我想(输入班级)打印全班全部科目成绩,不用打印学期和标志,成绩不用分类了,正常考试不及格的打印补考成绩,这个报表怎么做,怎么用SQL语句查询
查询成什么格式,请详细些说,我不太懂报表。
PS:小弟忙了很长时间了,可是总是搞不出来,已经拖了很长时间了,这周老师要要了
不能再拖了,请各位大狭帮帮忙,谢了。分不够可以再加。因等级不够,分贴给分
标志:是说是正常考试还是补考
现在我想(输入班级)打印全班全部科目成绩,不用打印学期和标志,成绩不用分类了,正常考试不及格的打印补考成绩,这个报表怎么做,怎么用SQL语句查询
查询成什么格式,请详细些说,我不太懂报表。
PS:小弟忙了很长时间了,可是总是搞不出来,已经拖了很长时间了,这周老师要要了
不能再拖了,请各位大狭帮帮忙,谢了。分不够可以再加。因等级不够,分贴给分
解决方案 »
- 关于excel导入到access的问题
- 如何获取桌面分辨率(不是显示器当前分辨率)?
- 关于dbGrid显示datetime列值为NUll时的问题
- Listbox的问题,为什么不能删除
- Delphi7 or Delphi8
- 怎么样手动添加一个事件????
- 请问如何办才能实现显示带有色彩边框的文字?
- 向各位高手请教,请问如何实现DBGrid支持鼠标滚轴的功能!
- 如何给一个程序加密码框,即在启动程序时要求输入用户名和密码,验证通过后才能进入系统。谢谢!
- ManageIT SQL-Station 5.0的注册码或汉化?
- 请问DELPHI有没有临时表这个概念!!!!
- 如何使用midstr函数啊?它说我没有声明
老兄你先做着啊,中间过程有什么问题再拿来问嘛。
还是CSDN好,DFW上一个人回复都没有
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
.............
然后就万事大吉了
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
left join (select 学号,成绩 from 表 where 标志='补考')b
where a.学期='你要的学期'
得到该班有几个科目,为每个科目创建一个临时视图(用完可以删掉)
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控件,并设置他的关键属性(代码中)
完成。
另外你提到就是学期的问题。如果你已经知道某个学期成绩的科目的话那做法
比这更简单。连视图都不要键了。只要写一个复杂点的查询语句就可以了
以上是我的做法,你自己在考虑一下!!
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
班级 学号 课程号 成绩可以用这条语句:
select * from t
(select 班级,学号,课程号,if(成绩>60,if(标志=正常考试,成绩,成绩),if(标志=补考,成绩,-1))
from 成绩基本表
) t
where 成绩<> -1
用这种方法选出来记录后按照班级 学号 课程号排序,就可以了。
select 学号,姓名,课程号,成绩 from 成绩表
where 班级 = @bj
and 成绩 >= 60
and 标志 = '正常考试'
union all
select 学号,姓名,课程号,成绩 from 成绩表
where 班级 = @bj
and 标志 = '补考') as A
order by A.学号,A.课程号
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。假定有一个表 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 都计算与本例显示相同的信息种类,但格式稍有不同。
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
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
我的email:[email protected]助人乃快乐之本
newdongkui(老乌鸦) 和 pengdali(大力) 写的
这样在FR中还要用交叉报表吗