分段统计的方式主要有两种,一种如下要求: 有两个表: 1.成绩分段表(ID为自增列) ID MaxFen MinFen ——————– 1 510 500 2 500 490 3 490 480
2.总成绩表 ClassID StudentID SumFen(总分) ———————————— 000005 000001 503 000005 000003 498 000004 000006 487 000004 000003 501
3.班级表 ClassID ClassName ———————– 000004 104班 000005 105班
要求结果: ≥500 ≥490 ≥480 —————————————- 105班 1 1 104班 1 1
总分分段值是随机的,最多30个分段 即要求分段为横向显示: 方法: – 示例数据 Create TABLE 成绩分段表( ID int IDENTITY, MaxFen int, MinFen int) Insert 成绩分段表 Select 510, 500 UNION ALL Select 500, 490 UNION ALL Select 490, 480
Create TABLE 总成绩表( ClassID varchar(10), StudentID varchar(10), SumFen int) Insert 总成绩表 Select ‘000005′, ‘000001′, 503 UNION ALL Select ‘000005′, ‘000003′, 498 UNION ALL Select ‘000004′, ‘000006′, 487 UNION ALL Select ‘000004′, ‘000003′, 501
Create TABLE 班级表( ClassID varchar(10), ClassName varchar(10)) Insert 班级表 Select ‘000004′, ‘104班’ UNION ALL Select ‘000005′, ‘105班’ GO
– 查询 DECLARE @s nvarchar(4000) SET @s = N” Select @s = @s + N’,’ + QUOTENAME(‘≥’ + RTRIM(MinFen)) + N’=SUM(CASE WHEN B.SumFen>=’ + RTRIM(MinFen) + N’ AND SumFen<’ + RTRIM(MaxFen) + N’ THEN 1 END)’ FROM 成绩分段表 orDER BY ID EXEC(N’ Select C.ClassName’ + @s + N’ FROM 班级表 C, 总成绩表 B Where C.ClassID = B.ClassID GROUP BY C.ClassName ‘) GO
– 删除测试 Drop TABLE 成绩分段表, 总成绩表, 班级表
– 结果:
ClassName≥500≥490≥480 104班1NULL1 105班11NULL
第二种要求则要求纵向显示: 有一组数据如下 编号(id) 重量(weight) 1 20 2 15 3 5 4 60 5 12 6 33 7 45 8 59 9 89 10 110 现在想在程序里动态的按区间统计。 比如 在程序里选择10——50 之间间隔10的有多少个。 希望的结果: 10-20 4 20-30 2 30-40 1 40-50 1
这里区间10,50 和间隔10 ,都是可以动态设定的。 declare @t table(id int,weight int) insert into @t select 1, 20 insert into @t select 2, 15 insert into @t select 3, 5 insert into @t select 4, 60 insert into @t select 5, 12 insert into @t select 6, 33 insert into @t select 7, 45 insert into @t select 8, 59 insert into @t select 9, 89 insert into @t select 10,110
declare @p int set @p=10 select rtrim(p*@p)+’-'+rtrim((p+1)*@p) as p, num from (select (weight/@p) as p,count(*) as num from @t where weight between 10 and 50 group by (weight/@p)) a
/* p num ————————- ———– 10-20 2 20-30 1 30-40 1 40-50 1 */
转载于:https://www.cnblogs.com/Gaojier/archive/2010/04/08/2783614.html