日期:2014-05-18  浏览次数:21160 次

如何用sql语句实现统计各分数段的个数
如果有这样的一个表
score
23
38
30
45
60
如何用sql语句实现统计各分数段的个数?
设定的分数段有:0~20、20~30、31~40、41~50、51~60等等如此。
那么上表通过SQL语句,会变成
分数段       个数
0~20             0
20~30           1
31~40           2
………………
请问各位,这种SQL语句应该怎么实现呢?


------解决方案--------------------
declare @t table (score int)
insert @t select 23
union all select 38
union all select 30
union all select 45
union all select 60

select cast(score/10*10 as varchar)+ '~ '+cast(score/10*10+10 as varchar),count(score) from @t group by score/10

---
20~30 1
30~40 2
40~50 1
60~70 1
------解决方案--------------------
笨办法:
declare @t table (score int)
insert @t select 23
union all select 38
union all select 30
union all select 45
union all select 60

select '0~20 ' 分数段,sum(case when score between 0 and 20 then 1 else 0 end) 个数
from @t
union all
select '21~30 ' 分数段,sum(case when score between 21 and 30 then 1 else 0 end) 个数
from @t
union all
select '31~40 ' 分数段,sum(case when score between 31 and 40 then 1 else 0 end) 个数
from @t
..............

--结果
分数段 个数
----- -----------
0~20 0
21~30 2
31~40 1

(所影响的行数为 3 行)


------解决方案--------------------
create table T(score int)
insert T select 23
union all select 38
union all select 30
union all select 45
union all select 60

select 分数段= '[0-20] ', 个数=(select count(*) from T where score between 0 and 20)
union all
select 分数段= '[21-30] ', 个数=(select count(*) from T where score between 21 and 30)
union all
select 分数段= '[31-40] ', 个数=(select count(*) from T where score between 31 and 40)
union all
select 分数段= '[41-50] ', 个数=(select count(*) from T where score between 41 and 50)
union all
select 分数段= '[51-60] ', 个数=(select count(*) from T where score between 51 and 60)

--result
分数段 个数
------- -----------
[0-20] 0
[21-30] 2
[31-40] 1
[41-50] 1
[51-60] 1

(5 row(s) affected)
------解决方案--------------------
declare @t table (score int)
insert @T select 23
union all select 38
union all select 30
union all select 45
union all select 60
select
score= case when score between 0 and 20 then '0-20 '
when score between 21 and 30 then '21-30 '
when score between 31 and 40 then '31-40 '
when score between 41 and 50 then '41-50 '
ELSE '60以上 'end,
记录=count(*)
from @T
group by case when score between 0 and 20 then '0-20 '
when score between 21 and 30 then '21-30 '
when score between 31 and 40 then '31-40 '
when score between 41 and 50 then '41-50 ' ELSE '60以上 ' end
(所影响的行数为 5 行)

score 记录
------ -----------
21-30 2
31-40 1
41-50 1
60以上 1

(所影响的行数为 4 行)