一个根据列的范围分组汇总的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,如需转载请自行联系原作者

相关文章
|
4月前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
45 1
|
19天前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
46 0
|
19天前
|
存储 SQL 数据库
如何使用 SQL Server 创建存储过程?
【8月更文挑战第31天】
49 0
|
2月前
|
SQL 数据挖掘 数据库
SQL分组函数
【7月更文挑战第24天】SQL分组函数
21 1
|
1月前
|
SQL
SQL SERVER数据分组后取第一条数据——PARTITION BY
SQL SERVER数据分组后取第一条数据——PARTITION BY
64 0
|
2月前
|
SQL 数据库
【SQL】已解决:SQL分组去重并合并相同数据
【SQL】已解决:SQL分组去重并合并相同数据
55 1
|
2月前
|
分布式计算 BI MaxCompute
SQL 能力问题之输出聚合的维度列的名称,如何解决
SQL 能力问题之输出聚合的维度列的名称,如何解决
|
3月前
|
存储 SQL 数据库
SQL 语言:存储过程和触发器
SQL 语言:存储过程和触发器
55 6
|
3月前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之如何查看SQL语句使用的是行索引还是列索引
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
3月前
|
SQL
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
64 0