再问邹建!!交叉表的奇怪问题
学生成绩表基表KSCJ如下:xh,kch,kscj(学号,课程号,考试成绩)
然后我生成了一个view(VIEW_KSCJ), xh,xm,bh,kch,kcmc,kscj(学号,姓名,班号,课程号,课程名称,考试成绩)。本来打算通过这个视图,来进行交叉表的查询,
但是发现在视图里这里不能使用,报错。
例如:
select XH,XM,总名次=(select sum(1) from(select XH,zcj=sum(KSCJ) from VIEW_KSCJ group by xh ) b where sum(a.KSCJ)<=zcj)
from VIEW_KSCJ a group by xh,xm
这里会报错:
服务器: 消息 8624,级别 16,状态 13,行 1
内部 SQL Server 错误。
换成使用
select XH,总名次=(select sum(1) from(select XH,zcj=sum(KSCJ) from VIEW_KSCJ group by xh ) b where sum(a.KSCJ)<=zcj)
from KSCJ a group by xh
通过,奇怪了,难道这里不能使用VIEW?
问题点数:20、回复次数:7Top
1 楼zjcxc(邹建)回复于 2004-08-01 17:08:47 得分 20
--试试(不行的话帖数据出来测试一下)
select XH,XM,总名次=(
select sum(1) from(
select XH,xm,zcj=sum(KSCJ)
from VIEW_KSCJ
group by xh,xm
) b where sum(a.KSCJ)<=b.zcj)
from VIEW_KSCJ a
group by xh,xm
Top
2 楼zh_zh_y(决不放弃)回复于 2004-08-01 17:36:46 得分 0
还是不行啊。
学号XH KCH KSCJ ID
00010001 0001 99.0 1
00010001 0002 99.0 2
00010001 0003 98.0 3
00010001 0004 97.0 4
00010002 0001 98.0 5
00010002 0002 99.0 6
00010002 0003 98.0 7
00010002 0004 97.0 8
00020001 0001 77.0 9
00020001 0002 78.0 10
00020001 0003 79.0 11
00020001 0004 80.0 12
view数据
学 号 姓名 课程号 成绩 班号 课程名称
00010001 张三 0001 99.0 0001 语文
00010001 张三 0002 99.0 0001 数学
00010001 张三 0003 98.0 0001 英语
00010001 张三 0004 97.0 0001 物理
00010002 李四 0001 98.0 0001 语文
00010002 李四 0002 99.0 0001 数学
00010002 李四 0003 98.0 0001 英语
00010002 李四 0004 97.0 0001 物理
00020001 王无 0001 77.0 0002 语文
00020001 王无 0002 78.0 0002 数学
00020001 王无 0003 79.0 0002 英语
00020001 王无 0004 80.0 0002 物理
Top
3 楼zh_zh_y(决不放弃)回复于 2004-08-01 17:38:21 得分 0
其中view是从三个基表中生成的。
学生表(xh,xm,bh)
课程表(kch,kcmc)
kschj(xh,kch,kscj)
Top
4 楼zjcxc(邹建)回复于 2004-08-01 20:39:26 得分 0
你给view数据给我做什么? 我要模拟你的环境,看看会否有这种问题才行啊.Top
5 楼zjcxc(邹建)回复于 2004-08-01 20:51:17 得分 0
--测试
--测试数据
create table 学生表(xh varchar(10),xm varchar(10),bh varchar(10))
insert 学生表 select '00010001','张三','0001'
union all select '00010002','李四','0001'
union all select '00020001','王无','0002'
create table 课程表(kch varchar(10),kcmc varchar(10))
insert 课程表 select '0001','语文'
union all select '0002','数学'
union all select '0003','英语'
union all select '0004','物理'
create table kschj(xh varchar(10),kch varchar(10),kscj decimal(10,1))
insert kschj select '00010001','0001',99.0
union all select '00010001','0002',99.0
union all select '00010001','0003',98.0
union all select '00010001','0004',97.0
union all select '00010002','0001',98.0
union all select '00010002','0002',99.0
union all select '00010002','0003',98.0
union all select '00010002','0004',97.0
union all select '00020001','0001',77.0
union all select '00020001','0002',78.0
union all select '00020001','0003',79.0
union all select '00020001','0004',80.0
go
--视图
create view VIEW_KSCJ
as
select a.xh,a.xm,a.bh,b.kch,b.kcmc,c.kscj
from 学生表 a,课程表 b,kschj c
where a.xh=c.xh
and b.kch=c.kch
go
--显示视图结果
select * from VIEW_KSCJ
go
--从视图中做统计
select XH,XM,总名次=(
select sum(1) from(
select XH,xm,zcj=sum(KSCJ)
from VIEW_KSCJ
group by xh,xm
) b where sum(a.KSCJ)<=b.zcj)
from VIEW_KSCJ a
group by xh,xm
go
--删除测试环境
drop table 学生表,课程表,kschj
drop view VIEW_KSCJ
/*--测试结果
xh xm bh kch kcmc kscj
---------- ---------- ---------- ---------- ---------- ------------
00010001 张三 0001 0001 语文 99.0
00010001 张三 0001 0002 数学 99.0
00010001 张三 0001 0003 英语 98.0
00010001 张三 0001 0004 物理 97.0
00010002 李四 0001 0001 语文 98.0
00010002 李四 0001 0002 数学 99.0
00010002 李四 0001 0003 英语 98.0
00010002 李四 0001 0004 物理 97.0
00020001 王无 0002 0001 语文 77.0
00020001 王无 0002 0002 数学 78.0
00020001 王无 0002 0003 英语 79.0
00020001 王无 0002 0004 物理 80.0
(所影响的行数为 12 行)
XH XM 总名次
---------- ---------- -----------
00010001 张三 1
00010002 李四 2
00020001 王无 3
(所影响的行数为 3 行)
--*/Top
6 楼zjcxc(邹建)回复于 2004-08-01 20:51:43 得分 0
没发现有问题.
如果你的是sql7.0,那就不知道了,没有这个测试环境.Top
7 楼zh_zh_y(决不放弃)回复于 2004-08-02 15:19:44 得分 0
使用的是sql2000,我再好好想想看,到底问题出在什么地方?
Top




