谢谢各位的回答,问题我已得到解决,我再次把需求简单描述下吧。
表库存表:卡名称、面额、卡号、状态等...
比如卡名称"上海珠宝卡"面额200的这个卡有很多,每个卡都有一个对应的卡号(比如向557105041502662,可能也有字母在卡号的前面),这些卡可能是一批卡,面额都一样的,假设有10000张,在数据库中一个卡号就是一条记录,但是客户不想看到列表中是一张张的卡,而是用卡号段统计出来的,比如557105041502662~557105041502761数量是100张。只要是卡号数字是连续的就组成一条记录显示卡号段和数量。
实际设计:表CardStock:CardId(卡种类)、IndetailId(入库单的Id)、CardNum(卡号)...
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就是卡号段,若是一张就直接显示卡号就行
select Count(*) from table where 卡号 between 卡号1 and 卡号2
思路1:将卡库存表导入reportservice数据库中,写SQL通过字符串函数分组查询统计,目测SQL会非常啰嗦,执行耗时很长,但不影响主库性能,且可以统计出结果
思路2:
新建一张卡号段统计表,然后分页批量查询卡库存,每次n条,查好后在内存中分组,最后插入或者更新卡号段统计表。因为你的业务逻辑要求必须全表查询,所以个人认为分页批量多次是较好的选择。
需求描述不清晰,卡段号是按照什么逻辑分段的?
将卡号字段数据处理为一个临时table,然后将条件处理为>=min and <=max,这样就能很容易求出数量了。。。对于这种,直接存储过程吧。。如果数据内存吃得住的话,直接查询出来,用Linq在内存中搞定。
这是老师给你出的算法题,还是你自己想出来的用来解决用户需求的解决方案?
卡端号有什么规律什么的?
WITH TAB AS (SELECT '16001111' CARD FROM DUAL UNION ALL SELECT '16001222' CARD FROM DUAL UNION ALL SELECT '16002111' CARD FROM DUAL UNION ALL SELECT '16003111' CARD FROM DUAL UNION ALL SELECT '16004111' CARD FROM DUAL UNION ALL SELECT '16005111' CARD FROM DUAL UNION ALL SELECT '16008111' CARD FROM DUAL) SELECT TO_CHAR(FLOOR((TO_NUMBER(SUBSTR(CARD, 1, 5)) + 1) / 3) * 3 - 1) || '~' || TO_CHAR(FLOOR((TO_NUMBER(SUBSTR(CARD, 1, 5)) + 1) / 3) * 3 + 2), COUNT(1) FROM TAB GROUP BY FLOOR((TO_NUMBER(SUBSTR(CARD, 1, 5)) + 1) / 3) ORDER BY FLOOR((TO_NUMBER(SUBSTR(CARD, 1, 5)) + 1) / 3)
截取字符串, 转换成数字,
加 1, 以便 最小值能被 3整除,
按商分组
取结果时 把刚才的 加的 1 减去.
我这儿没 Sql Service
对应的 TO_NUMBER, TO_CHAR 请自行转换成 CONVERT
对应的 || 请自行转换成 +