求高手指点~查询某一个分数段的人数

NingJuHuan 2013-11-06 01:49:52
查询一个表里面某一分段里面有多少人表1
sno score
1 150
2 133
3 123
4 80
5 90
6 60
7 34
8 21
9 102
表2
sno score
11 12
22 105
33 76
42 98
53 88
63 78
72 77
82 111
92 132
查询score在150,145-140,140-135.......5-0分数段的人,
如果将此分数间隔变成10,20又该怎么查?
...全文
269 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
NingJuHuan 2013-11-10
  • 打赏
  • 举报
回复
谢谢~~~~
引用 8 楼 yupeigu 的回复:
上面的是间隔为10的,只需要修改@interval=10 就可以设置建个为10的:
if object_id('s') is not null
   drop table s
go

create table s(id int,score int)

INSERT INTO s
SELECT 1,	150
UNION ALL SELECT 2,	133
UNION ALL SELECT 3,	123
UNION ALL SELECT 4,	80
UNION ALL SELECT 5,	90
UNION ALL SELECT 6,	60
UNION ALL SELECT 7,	34
UNION ALL SELECT 8,	21
UNION ALL SELECT 9,	102
go

declare @table_name nvarchar(100);
declare @sql nvarchar(max);
declare @start int;
declare @end int;
declare @interval int;

select @start = 0,    --开始的分数
       @end = 150,    --结束的分数
       @interval = 20,--这里的间隔改为20
       @sql = '',
       @table_name = 's';  --这里的表的名称是s

;with t
as
(
select @start as start_score,@start + @interval as end_score
union all
select start_score + @interval,
       case when end_score + @interval > @end
                 then @end
            else end_score + @interval
       end
from t
where start_score + @interval < @end
),

tt
as
(
select start_score,
       end_score,
       cast(end_score as varchar) +'-'+cast(start_score as varchar) as score_range
from t
)

select @sql = @sql + 
              ',count(case when score >'+cast(start_score as varchar) + 
              ' and score <= '+cast(end_score as varchar) + 
              ' then 1 else null end) as ['+score_range +']'
from tt

set @sql = 'select '+stuff(@sql,1,1,'') + ' from '+@table_name 

--select @sql

exec(@sql)
/*
20-0	40-20	60-40	80-60	100-80	120-100	140-120	150-140
0	2	1	1	1	1	2	1
*/
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
上面的是间隔为10的,只需要修改@interval=10 就可以设置建个为10的:
if object_id('s') is not null
   drop table s
go

create table s(id int,score int)

INSERT INTO s
SELECT 1,	150
UNION ALL SELECT 2,	133
UNION ALL SELECT 3,	123
UNION ALL SELECT 4,	80
UNION ALL SELECT 5,	90
UNION ALL SELECT 6,	60
UNION ALL SELECT 7,	34
UNION ALL SELECT 8,	21
UNION ALL SELECT 9,	102
go

declare @table_name nvarchar(100);
declare @sql nvarchar(max);
declare @start int;
declare @end int;
declare @interval int;

select @start = 0,    --开始的分数
       @end = 150,    --结束的分数
       @interval = 20,--这里的间隔改为20
       @sql = '',
       @table_name = 's';  --这里的表的名称是s

;with t
as
(
select @start as start_score,@start + @interval as end_score
union all
select start_score + @interval,
       case when end_score + @interval > @end
                 then @end
            else end_score + @interval
       end
from t
where start_score + @interval < @end
),

tt
as
(
select start_score,
       end_score,
       cast(end_score as varchar) +'-'+cast(start_score as varchar) as score_range
from t
)

select @sql = @sql + 
              ',count(case when score >'+cast(start_score as varchar) + 
              ' and score <= '+cast(end_score as varchar) + 
              ' then 1 else null end) as ['+score_range +']'
from tt

set @sql = 'select '+stuff(@sql,1,1,'') + ' from '+@table_name 

--select @sql

exec(@sql)
/*
20-0	40-20	60-40	80-60	100-80	120-100	140-120	150-140
0	2	1	1	1	1	2	1
*/
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
试试:
if object_id('s') is not null
   drop table s
go

create table s(id int,score int)

INSERT INTO s
SELECT 1,	150
UNION ALL SELECT 2,	133
UNION ALL SELECT 3,	123
UNION ALL SELECT 4,	80
UNION ALL SELECT 5,	90
UNION ALL SELECT 6,	60
UNION ALL SELECT 7,	34
UNION ALL SELECT 8,	21
UNION ALL SELECT 9,	102
go

declare @table_name nvarchar(100);
declare @sql nvarchar(max);
declare @start int;
declare @end int;
declare @interval int;

select @start = 0,    --开始的分数
       @end = 150,    --结束的分数
       @interval = 10,--间隔
       @sql = '',
       @table_name = 's';  --这里的表的名称是s

;with t
as
(
select @start as start_score,@start + @interval as end_score
union all
select start_score + @interval,
       case when end_score + @interval > @end
                 then @end
            else end_score + @interval
       end
from t
where start_score + @interval < @end
),

tt
as
(
select start_score,
       end_score,
       cast(end_score as varchar) +'-'+cast(start_score as varchar) as score_range
from t
)

select @sql = @sql + 
              ',count(case when score >'+cast(start_score as varchar) + 
              ' and score <= '+cast(end_score as varchar) + 
              ' then 1 else null end) as ['+score_range +']'
from tt

set @sql = 'select '+stuff(@sql,1,1,'') + ' from '+@table_name 

--select @sql

exec(@sql)
/*
10-0	20-10	30-20	40-30	50-40	60-50	70-60	80-70	90-80	100-90	110-100	120-110	130-120	140-130	150-140
0	0	1	1	0	1	0	1	1	0	1	0	1	1	1
*/
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
你这里的 : 查询score在150,145-140,140-135.......5-0 具体是怎么判断的呢,比如 140分,是算在:145-140, 还是算在:140-135
chen357313771 2013-11-06
  • 打赏
  • 举报
回复
没明白,表1表2啥关系,比如:90属于80到90直接还是90到100之间呢 不明白,不明白,是不是你想要的。。。
DECLARE @SpaceScore INT=10  --分数间隔
DECLARE @EndScore	INT=150
IF OBJECT_ID('tempdb..#ScoreOut','U') IS NOT NULL DROP TABLE #ScoreOut
CREATE TABLE #ScoreOut
(
	 Id INT IDENTITY(1,1)
	,StartScore	INT
	,EndScore	INT
)
;WITH CTE(Score)
AS (
	SELECT 0 AS Score
	UNION ALL
	SELECT Score+@SpaceScore
	FROM CTE
	WHERE Score<@EndScore-@SpaceScore
)
INSERT INTO #ScoreOut(StartScore,EndScore)
SELECT Score,Score+@SpaceScore
FROM CTE
IF OBJECT_ID('tempdb..#Score','U') IS NOT NULL DROP TABLE #Score
CREATE TABLE #Score
(
	 sno INT 
	,Score	INT
)
INSERT INTO #Score
SELECT 1,	150
UNION ALL SELECT 2,	133
UNION ALL SELECT 3,	123
UNION ALL SELECT 4,	80
UNION ALL SELECT 5,	90
UNION ALL SELECT 6,	60
UNION ALL SELECT 7,	34
UNION ALL SELECT 8,	21
UNION ALL SELECT 9,	102


SELECT CAST(B.StartScore AS VARCHAR)+'-'+CAST(B.EndScore AS VARCHAR) AS ScoreSpace
	,COUNT(*) AS Cnt
FROM #Score AS A
JOIN #ScoreOut AS B ON A.Score BETWEEN B.StartScore AND B.EndScore
GROUP BY CAST(B.StartScore AS VARCHAR)+'-'+CAST(B.EndScore AS VARCHAR)


/*
ScoreSpace	Cnt
100-110	1
120-130	1
130-140	1
140-150	1
20-30	1
30-40	1
50-60	1
60-70	1
70-80	1
80-90	2
90-100	1
*/
xxfvba 2013-11-06
  • 打赏
  • 举报
回复
select ceiling(score/5.0),count(*) from 表1 group by ceiling(score/5.0)
haitao 2013-11-06
  • 打赏
  • 举报
回复
引用 2 楼 NingJuHuan 的回复:
可能是没描述好,数据量比较大,然后出结果最好是以EXCEL文件保存那种
查询结果可以保存为多种格式的文件的 也可以全选,复制粘贴到excel
NingJuHuan 2013-11-06
  • 打赏
  • 举报
回复
可能是没描述好,数据量比较大,然后出结果最好是以EXCEL文件保存那种
haitao 2013-11-06
  • 打赏
  • 举报
回复
select score/5 as fs,count(*) fc
from t
group by score/5
1,项目功能:开发一个在线学习平台,一共3个身份:管理员,老师和学生!   ①管理员功能:登录后可以添加学生信息,管理所有学生信息,添加单个老师信息,也可以批量导入很多老师信息,管理所有老师信息,添加和管理学院信息,发布课程信息,管理所有课程,查看回复话题讨论信息,发布网站公告,管理网站公告信息!    ②教师功能:上传课程视频信息,查询管理所有教学视频,上课课程文档课件信息,查询管理所有课件文档,新增讨论话题信息,查询编辑管理所有话题信息,按照课程发布作业信息,可以向某次作业中加入题目信息,也可以删除题目信息,每个题目带有分数值,老师可以修改个人信息。    ③学生功能:查询所有课程信息,在线课程视频信息查询,可以在线观看某个视频教学,查询和下载所有的课件文件,查看所有话题讨论信息,可以回复话题,也可以查看话题的回复信息,可以查询网站公告信息,查询老师布置的作业,进入作业题目列表做题,提交可以查看完成作业的分数,可以修改个人信息。2,涉及技术:SSM框架(Spring,SpringMVC,MyBatis),MySQL数据库,Maven,Tomcat3,开发环境:IDEA4,讲解方式:从环境安装,项目搭建,以及项目介绍等进行讲解5,包含资料:项目源码(含数据库文件),环境安装包,项目文档。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧