首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求~查询某一个分数段的人数

2013-11-12 
求高手指点~查询某一个分数段的人数查询一个表里面某一分段里面有多少人表1snoscore115021333123480590660

求高手指点~查询某一个分数段的人数
查询一个表里面某一分段里面有多少人表1
sno    score
1150
2133
3123
480
590
660
734
821
9102
表2
sno   score
1112
22105
3376
4298
5388
6378
7277
82111
92132
查询score在150,145-140,140-135.......5-0分数段的人,
如果将此分数间隔变成10,20又该怎么查? 不明白,不明白,是不是你想要的。。。

DECLARE @SpaceScore INT=10  --分数间隔
DECLARE @EndScoreINT=150
IF OBJECT_ID('tempdb..#ScoreOut','U') IS NOT NULL DROP TABLE #ScoreOut
CREATE TABLE #ScoreOut
(
 Id INT IDENTITY(1,1)
,StartScoreINT
,EndScoreINT
)
;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 
,ScoreINT
)
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)


/*
ScoreSpaceCnt
100-1101
120-1301
130-1401
140-1501
20-301
30-401
50-601
60-701
70-801
80-902
90-1001
*/

[解决办法]
试试:
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-020-1030-2040-3050-4060-5070-6080-7090-80100-90110-100120-110130-120140-130150-140
001101011010111
*/

热点排行