这条 SQL 语句怎么写?(300分)

  • 主题发起人 主题发起人 wangrui
  • 开始时间 开始时间
W

wangrui

Unregistered / Unconfirmed
GUEST, unregistred user!
有2个表

学生表(学号,姓名,班级)
101 张三 一班
102 李四 一班
103 王武 二班
... ... ...

成绩表(学号,课程,成绩,学期)
101 数学 80 1
101 英语 70 1
101 化学 90 1
101 语文 88 2
101 政治 77 2
101 ... .. ...
. . . .
. . . .
. . . .
102 数学 99 1
102 英语 88 1
102 ... .. ...

现在我想得到某个学期某班的成绩单,例如一班第二学期所有学生的成绩单

学号 姓名 语文 政治 ...
101 张三 88 77
102 李四 66 87 ...
... ... ... ... ...

要求这个 SQL 语句 能够得到任意学期,任意班级的成绩单

关键是每个学期所开课程不同,事先不知道有哪些课程,我感觉挺难办




 
分两句
先用select distinct 课程 from 成绩表
得出所有课程,
再拼进
'select 学号,姓名,'+{课程} +'from 学生表 ,成绩表 where
学生表.学号=课程表.学号 order by 学生表.学号'
 
写详细些

with Query1 do begin
Close;
Sql.Text:='select distinct 课程 from 成绩表'
Open;
end;

TempStr:='select 学号,姓名';

for i:=0 to Query1.FieldCount-1 do
TempStr:=TempStr+','+Query1.Fields;

TempStr:=TempStr+'from 学生表 ,成绩表 where 学生表.学号=课程表.学号
order by 学生表.学号';

Query1.Close;
Query1.Sql:=TempStr;
Query1.Open;


(也许后半部分的Sql有些小错误,对Sql不是太熟的说)
 
使用的什么数据库?
 
对不起,这是关系型数据库的特点,这是一个关系模型的死角,解决办法是,
把课程表中的记录动态建立临时表。一条SQL是无法做出来的。你想SELECT后
要的是域,你却给它元组,显然不行。这是一个CROSSTAB。
如果小弟说错,请赐教。
 
To 阿朱:
如果没记错,好象Access,Ms SQL有什么语句可以行列转换,是在一本VB书上看的,
当时是初雪数据库编程。没有理解清楚。

BTW:
阿朱,你对分布式数据库比较熟悉,我开个题目给我将奖,怎么样?
 
呵呵,查到了,好象是交叉表查询。使用TRANSFORM.
 
我也感兴趣!
 
前卫:
transform 怎么用?
 
ACCESS中Ms SQL可以自动生成。再分析,方便
 
这是行列转换的问题。好象有人写过这种存储过程。
但是直接做好象做不了。
不知道沈前卫是怎么做的。
 
Hehe,我没作过,是Access中的一个TRANSFORM,具体用法查阅Ms Access的帮助文件.
 
多谢各位指教,我找到了 Transform 的帮助,贴出来和大家共享:

TRANSFORM aggfunction
selectstatement
PIVOT pivotfield [IN (value1[, value2[, ...]])]

TRANSFORM 语句可分为以下几个部分:

部分 描述
aggfunction 在选定数据上运作的 SQL 合计函数。
selectstatement SELECT 语句。
pivotfield 在查询的结果集中创建列标题时用的字段或表达式。
value1, value2 用来创建列标题的固定值。
说明

使用交叉表查询来摘要数据时,从指定的字段或表达式中选定值作为列标题,这样,可以用比选定查询更紧凑的格式来观察数据。
TRANSFORM 是可选的,但在使用它时,要作为 SQL 字符串中的第一个语句。它出现在 SELECT 语句(指定作为行标题的字段的)之前,还出现在 GROUP BY 子句(指定行分组的)之前。可以有选择地包含其它子句,例如 WHERE 子句,它指定附加的选择或排序条件。也可以将子查询当作谓词,特别是在叉表查询的 WHERE 子句中。

pivotfield 返回的值被用作查询结果集中的列标题。例如,在交叉表查询中,将根据销售图表按销售月份创建 12 个列。可以限制 pivotfield 用列在可选的 IN 子句中的固定值(value1, value2)来创建标题。也可以用没有数据存在的固定值来创建附加的列。

例子是用VB写的,我就不贴了,大家如果感兴趣的话,自己去看吧!
 
后退
顶部