开发者社区> 吞吞吐吐的> 正文

一个根据列的范围分组汇总的Sql存储过程

简介:
+关注继续查看

1.需求说明

有如下表数据:

ID          NUM
----------- -----------
1           2
2           3
3           2
4           2
5           12
6           2
7           1
8           5
9           1
10          1
11          1

输入分组参数,比如输入 "2,5,8,10" ,实现按 ID<=2,2<ID<=5,5<ID<=8,8<ID<=10,ID>10 分组查询,要得到下面的数据:

groupdata  num
---------- -----------
id<=2      5
2<id<=5    16
5<id<=8    8
8<id<=10   2
id>10      1

2.存储过程如下:

--测试数据

create table TestData(ID int,NUM int)

insert TestData select 1,2

union all select 2,3

union all select 3,2

union all select 4,2

union all select 5,12

union all select 6,2

union all select 7,1

union all select 8,5

union all select 9,1

union all select 10,1

union all select 11,1

go

 

create proc spgroupcol

@numlist varchar(1000)

as

set nocount on

declare @t table(id int identity,groupdata varchar(10),int,int)

declare @i int,@pnum varchar(10),@j int

select @i=charindex(',',@numlist)

 ,@pnum=left(@numlist,@i-1)

insert @t select 'id<='+@pnum,null,@pnum

 

while @i>=1

begin

 select @numlist=substring(@numlist,@i+1,len(@numlist)-@i)

 select @j=charindex(',',@numlist) ;  

if @i=@j

    begin

    insert @t select @pnum+'<id<='+substring(@numlist,0,@i),@pnum,substring(@numlist,0,@i)

    select @pnum=left(@numlist,@i-1);

    end

else

    begin

    insert @t select @pnum+'<id<='+substring(@numlist,0,@i+1),@pnum,substring(@numlist,0,@i+1)

    select @pnum=left(@numlist,@i);

    end

    select @i=charindex(',',@numlist) ;      

end

 

insert @t select 'id>'+@numlist,@numlist,null

select b.groupdata,num=sum(a.num)

from TestData a,@t b

where case 

 when b.is null then case when a.id<=b.then 1 else 0 end

 when b.is null then case when a.id>b.then 1 else 0 end

 else case when a.id>b.and a.id<=b.then 1 else 0 end

 end=1

group by b.groupdata

order by min(b.id)

go

 

spgroupcol '2,5,8,10'

drop table TestData

sql存储过程的单步调试要在Vs2008中,服务器管理器中连接上数据库,找到存储过程右键单步调试。


本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2009/09/12/groupcolumnscope.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19663 0
MS SQL查询库、表、列数据结构信息汇总
前言 一般情况我们下,我们是知道数据库的表、列信息的(因为数据库是我们手动设计),但特殊情况下,如果你只能拿到数据库连接信息,也就是知道的一个数据库名的情况下,你要怎么得到它下面的所有表名,所有列表,以及主键,是否自增?等这些信息,那么本文将给您揭晓这个答案。
641 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18657 0
MySQL 主从复制资料汇总
1,复制原理 官方参考文档:http://dev.mysql.com/doc/refman/5.6/en/replication.
1061 0
MS-SQL数据库开发常用汇总 (收藏)
 MS-SQL数据库开发常用汇总 1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.
916 0
SQL Server 2008 R2——使用FULL OUTER JOIN实现多表信息汇总
原文:SQL Server 2008 R2——使用FULL OUTER JOIN实现多表信息汇总 =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我 勿用于学术性引用。
983 0
Mysql实战常见问题汇总
引言 项目中使用Mysql经常会遇到修改编码格式、导入sql、导出sql、windows授权、查看删除死锁进程等操作。 特总结如下:
17 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
9028 0
4852
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载