如何用SQL循环查询语句

我有一个表格要统计成绩的分数段的人数。我的查询语句是:select学校代码,学校名称,count(*)as人数,'304-305'as总成绩fromcjdwhere总成绩... 我有一个表格要统计成绩的分数段的人数。
我的查询语句是:
select 学校代码,学校名称,count(*) as 人数,'304-305' as 总成绩
from cjd
where 总成绩>=304 and 总成绩<305
group by 学校代码,学校名称
下面还要依次查询成绩段 “305-306”,“306-307”,“307-308”…… 到600多的人数,如果我每次都这样查询的话不知道要按到是你时候。
所以我想知道怎么样用循环查询语句一次性把数据查出来。我对于SQL不是很懂,如果可以话,尽量详细点。
图片是这样的,我把学校代码和学校名称都删了,省的引起没必要的麻烦。
展开
 我来答
z6220601
2011-12-07 · TA获得超过378个赞
知道小有建树答主
回答量:428
采纳率:0%
帮助的人:572万
展开全部
最好的方法是使用存储过程,然后使用一个临时表,把每次选择的数据保存到临时表中。
临时表可以在存储过程中使用 creat table #表名(字段纯知返 字段类型) 来创建,这样的表只在当前存在,相当于放到了内存里,你也可以实际的建一个表,然后把查出的结果都保存进去。以后选择都从这个表里查。
大概意思就做饥是这样
declare @tmp=304
creat table #临时表(学校名称 varchar(200),学校代码 varchar(200),人数 int,总成绩 varchar(30))
while @tmp<600
begin
declare @tmpb=@tmp+1
declare @zcj=@tmp+'-'+@tmpb
insert into #临时表 select 学校代码,学校名称,count(*) as 人数,@zcj as 总成绩 from cjd where 总成绩>=@tmp and 总成绩<@tmpb group by 学校代码,学校名称
@tmp=@tmp+1
end
select * from #临时表
go

大概的意思就是这样,如果你创建好了本地实际的表,那就省掉创建表,然后把数据插到创建好的表中即可,而且这样方便你以后做各猛槐种查询,所以推荐你还是创建一个这样的表比较好。
百度网友cf38862
2011-12-07 · 超过77用户采纳过TA的回答
知道小有建树答主
回答量:205
采纳率:0%
帮助的人:140万
展开全部
这个真够变态的,我也没想到什么好尘汪的方法,暂时就用这个比较恶心的方法吧:

select 学晌兄尺校代码,学校名称,0 人数,'' as 总成绩 into #Temp from cjd where 1=2
DECLARE @begNum int
DECLARE @endNum int
SET @begNum=304
SET @endNum=600
WHILE @begNum<@endNum
BEGIN
INSERT INTO #Temp (学校代码,学宴高校名称,人数,总成绩)
select 学校代码,学校名称,count(*) as 人数,CONVERT(VARCHAR,@begNum)+'-'+CONVERT(VARCHAR,@endNum) as 总成绩
from cjd
where 总成绩>=@begNum and 总成绩<(@begNum+1)
group by 学校代码,学校名称
SET @begNum=@begNum+1
END
SELECT * FROM #Temp
追问
我把你的直接复制到   SQL Server   的查询里面,有语法错误,
消息 208,级别 16,状态 1,第 1 行
对象名 'cjd' 无效。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
king7788520
推荐于2017-11-24 · TA获得超过262个赞
知道小有建树答主
回答量:120
采纳率:0%
帮助的人:151万
展开全部
能先告诉我你用的是什么数据库吗?
SQL是通用的,但各数据库的函数不是通用的。
更多追问追答
追问
SQL Server Management Studio   这个,,
追答
奥,还有个问题,成绩里有小数吗?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
啊DAI乖
2011-12-07 · TA获得超过105个赞
知道答主
回答量:177
采纳率:0%
帮助的人:175万
展开全部
我友含觉得你这样查很没用,如果你差扒真的想这么查,可以这样:
declare @school char(20)
declare @school_name char(20)
declare @count int
declare @zcj float
declare @zcj1 float
declare @zcj2 float
declare @i int
set i=4
while(i<=300)
begin
select @school=学校代码好庆笑,@school_name=学校名称,@count=count(*),@zcj=总成绩
form cjd
where 总成绩>=300+i and 总成绩<300+i+1
set @zcj1=300+i
set @zcj2=300+i+1
print "学校代码:"+@school+" 学校名称:"+@school_name+" 人数:"+cast(@count as char(20))+" 总成绩:"+case(@zcj1 as char(20))+"---"+case(@zcj2 as char(20))
set i=i+1
end
追问
我把你的直接复制到   SQL Server   的查询里面,有语法错误,
消息 102,级别 15,状态 1,第 8 行
'=' 附近有语法错误。
消息 102,级别 15,状态 1,第 12 行
'form' 附近有语法错误。
消息 128,级别 15,状态 1,第 16 行
在此上下文中不允许使用名称 "学校代码:"。有效表达式包括常量、常量表达式和变量(在某些上下文中)。不允许使用列名。
追答
代码长了是容易出些小差错的,调试一下就可以了,大概思路是这样,看那结果,我改了一下,如果还不行,你还是联系Q询问吧
declare @school char(20)
declare @school_name char(20)
declare @count int
declare @zcj float
declare @zcj1 float
declare @zcj2 float
declare @i int
set @i=4
while(@i=300+@i and 总成绩<300+@i+1
set @zcj1=300+@i
set @zcj2=300+@i+1
print '学校代码:'+@school+' 学校名称:'+@school_name+' 人数:'+cast(@count as char(20))+' 总成绩:'+cast(@zcj1 as char(20))+'---'+cast(@zcj2 as char(20))
set @i=@i+1
end
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wenli158
2011-12-07 · TA获得超过125个赞
知道小有建树答主
回答量:162
采纳率:0%
帮助的人:110万
展开全部
declare @i int
select @i =304
while @i < 600--(你要查询毁碧兆的最大分数)
begin
exec('纤租select 学校代码,学校名称,count(*) as 人数,'304-305' as 总成绩
from cjd
where 总成绩>='+convert(varchar(5),@i)+' and 总慧并成绩<'+convert(varchar(5),(@i+1))+'
group by 学校代码,学校名称')
set @i=@i+1
end
更多追问追答
追问
我把你的直接复制到   SQL Server   的查询里面,有语法错误,
消息 102,级别 15,状态 1,第 5 行
'304' 附近有语法错误。
我对代码不是很懂哦,所以找不出原因,,
追答
convert(varchar(5),@i)改成@i,convert(varchar(5),(@i+1))改成(@i+1),写错了哈。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式