问题

  1. /*  
  2. 问题:***统计不连续卡号问题****  
  3. 数据库中有一批卡,怎样统计出每种卡的起止卡号,比如  
  4. 卡种类   面值      卡号  
  5.  ===========================  
  6.  电费卡    50       00111111  
  7.  电费卡    50       00111112  
  8.  电费卡    50       00111113  
  9.  电费卡    50       00111114  
  10.  电费卡    50       00111119  
  11.  电费卡    50       00111120  
  12.  电费卡    50       00111121  
  13.  电费卡    50       00111122  
  14.  移动卡    50       10111110  
  15.  移动卡    50       10111111  
  16.  移动卡    50       10111112  
  17.  移动卡    50       10111113  
  18.  电费卡    100      0110111112  
  19.  电费卡    100      0110111113  
  20.  电费卡    100      0110111114  
  21.    
  22. 期望得到的结果:  
  23.  卡种类   面值    张数  开始卡号      结束卡号  
  24.  ===========================================  
  25.  电费卡    50      4     00111111       00111114  
  26.  电费卡    50      4     00111119       00111122  
  27.  电费卡    100     3     0110111113     0110111114  
  28.  移动卡    50      4     10111110       10111113  
  29. */  

SQL

  1. --sql  
  2. create table #card (cardtype varchar(20),cardvalue int,cardno varchar(20))  
  3. insert into #card  
  4. select '电费卡','50','00111111' 
  5. union all select '电费卡','50','00111112' 
  6. union all select '电费卡','50','00111113' 
  7. union all select '电费卡','50','00111114' 
  8. union all select '电费卡','50','00111119' 
  9. union all select '电费卡','50','00111120' 
  10. union all select '电费卡','50','00111121' 
  11. union all select '电费卡','50','00111122' 
  12. union all select '移动卡','50','10111110' 
  13. union all select '移动卡','50','10111111' 
  14. union all select '移动卡','50','10111112' 
  15. union all select '移动卡','50','10111113' 
  16. union all select '电费卡','100','0110111112' 
  17. union all select '电费卡','100','0110111113' 
  18. union all select '电费卡','100','0110111114' 
  19.  
  20. select ROW_NUMBER() over (order by t1.cardno),t1.* from #card t1  
  21.  
  22. select convert(bigint,t.cardno)-no as type,t.* from (  
  23. select ROW_NUMBER() over (order by t1.cardno) as no,t1.* from #card t1 ) t  
  24.  
  25. select type,cardtype,cardvalue,COUNT(*),MIN(cardno),MAX(cardno)  
  26. from (  
  27. select convert(bigint,t.cardno)-no as type,t.* from (  
  28. select ROW_NUMBER() over (order by t1.cardno) as no,t1.* from #card t1 ) t  
  29. ) tt  
  30. group by type,cardtype,cardvalue  
  31. --最终sql  
  32. select cardtype,cardvalue,cnt,mincardno,maxcardno from (  
  33. select type,cardtype,cardvalue,COUNT(*) as cnt,MIN(cardno) as mincardno,MAX(cardno) as maxcardno  
  34. from (  
  35. select convert(bigint,t.cardno)-no as type,t.* from (  
  36. select ROW_NUMBER() over (order by t1.cardno) as no,t1.* from #card t1 ) t  
  37. ) tt  
  38. group by type,cardtype,cardvalue  
  39. ) ttt  

结果

 

  1. /* 结果  
  2. cardtype             cardvalue   cnt         mincardno            maxcardno  
  3. -------------------- ----------- ----------- -------------------- --------------------  
  4. 电费卡                  50          4           00111111             00111114  
  5. 电费卡                  50          4           00111119             00111122  
  6. 移动卡                  50          4           10111110             10111113  
  7. 电费卡                  100         3           0110111112           0110111114  
  8.  
  9. (4 行受影响)  
  10. */ 

清理sql

 

  1.  
  2. drop table #card