当前位置:坤哥网-kungge-sqlserver卡号段分组

sqlserver卡号段分组

2015/7/29 0:44:00 坤哥网阅读(856) 评论(0)

之前给上海一家电子商务公司做一个卖卡系统,遇到了卡号段分组的问题。刚开始没什么好的实现方法,遂在博客园求助但未果,没法自己研究sql,终于搞定。

问题描述

有个卡库存表,有个卡号字段,假设数据:16001,16002,16003,16008.16009,16010,16211,16212。注:实际的数据量会很大,卡
号会很长。 现在要这样用sql统计出来,或者用程序实现,卡段号:16001~16003 数量:3    卡段号:16008~16010 数量:3   
  卡段号:16211~16212 数量:2 

 

需求描述:

表库存表:卡名称、面额、卡号、状态等...

比如卡名称"上海珠宝卡"面额200的这个卡有很多,每个卡都有一个对应的卡号(比如557105041502662,可能也有字母在卡号的前面),这些卡可能是一批卡,面额都一样的,假设有10000张,在数据库中一个卡号就是一条记录,但是客户不想看到列表中是一张张的卡,而是用卡号段统计出来的,比如557105041502662~557105041502761数量是100张。只要是卡号数字是连续的就组成一条记录显示卡号段和数量。

实际设计:表CardStock:CardId(卡种类)、IndetailId(入库单的Id)、CardNum(卡号)...

解决的sql:

1 select CardId,IndetailId, (case when sum(1)>1 then cast(MIN(CardNum) as varchar(32))+ '~'+ cast(MAX(CardNum) as varchar(32)) else cast(MIN(CardNum) as varchar(32)) end) AS CardNumSection, sum(1) as CardCount,  from( SELECT CardId ,IndetailId ,CardNum, CardNum - ROW_NUMBER() OVER(partition by CardId ,IndetailId ORDER BY CardNum) AS grp  FROM CardStock) v
View Code

 

其中CardNumSection就是卡号段,若是一张就直接显示卡号就行,完美解决

 

分类: SqlServer

有话要说? =>【不用注册,直接登录】,然后刷新本页面来发表您的观点(●'◡'●)