分段统计查询的方法

分段统计的方式主要有两种,一种如下要求:
有两个表:
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值