之前给上海一家电子商务公司做一个卖卡系统,遇到了卡号段分组的问题。刚开始没什么好的实现方法,遂在博客园求助但未果,没法自己研究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:
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
其中CardNumSection就是卡号段,若是一张就直接显示卡号就行,完美解决