利用SQL进行字符串切分统计

背景:
        数据库:SQLSERVER 2008
        原始数据表(TestTable)如下,需要统计每个数字出现的个数,不希望在程序中全部取出后逐个切分相加,所以想到用SQL实现切分统计
           
  1. colunname
  2. 02;03;04
  3. 01
  4. 01;02;03
  5. 02;03
  6. 02;03;04
  7. 01
  8. 02;04
  9. 01;03
  10. 01;02
  11. 02;05
  12. 01
  13. 02
  14. 03
  15. 01;02
  16. 01
  17. 01
  18. 01;03
  19. 01;02
  20. 02

实现:利用 master..spt_values系统表的自增常量切分

  1. select
  2. -- 截取当前b的index的位置开始,第一个出现切分符的内容
  3. substring(a.[columname], b.number, charindex(‘;‘, a.[columname] + ‘;‘, b.number) - b.number) as ans1
  4. FROM TestTable a, 
  5. -- 系统表
  6. master..spt_values b
  7. WHERE 
  8. -- 从0开始的自增正整数
  9. b.type=‘p‘ 
  10. -- 从第一个字符截取到切分符的位置‘;‘,相当于index
  11. and substring(‘;‘ + a.[columname],b.number, 1) = ‘;‘
具体执行顺序大致如下假设当前字符串为‘12;345;6‘
    1. b.number = 0  看判断条件  substring(‘;12;345;6‘,0, 1) = null(知识点注解) 不等于 = ‘;‘ 执行下一步b.number+1
    2. b.number = 1  看判断条件  substring(‘;12;345;6‘,1, 1) = ‘;‘因此取值
     substring(‘12;345;6‘, 1, charindex(‘;‘, ‘12;345;6‘ + ‘;‘, 1) - 1)而  
    charindex(‘;‘, ‘12;345;6;‘, 1) = 3 所以相当于取
    substring(‘12;345;6‘, 1, 2) 因此取出了 12
    3. b.number = 2  看判断条件  substring(‘;12;345;6‘,2, 1) = 1 同1
    4. b.number = 3  看判断条件  substring(‘;12;345;6‘,3, 1) = 1 同1
    4. b.number = 4  看判断条件  substring(‘;12;345;6‘,4, 1) = ‘;‘因此取值
     substring(‘12;345;6‘, 4, charindex(‘;‘, ‘12;345;6‘ + ‘;‘, 4) - 4)而  
    charindex(‘;‘, ‘12;345;6;‘, 4) = 7 所以相当于取
    substring(‘12;345;6‘, 4, 3) 因此取出了 345
。。。。

执行上述SQL取出结果
  1. 03
  2. 02
  3. 03
  4. 02
  5. 03
  6. 04
  7. 01
  8. 02
  9. 04
  10. 01
  11. 03
  12. 01
  13. 02
  14. 02
  15. 05
  16. 01
  17. 02
  18. 03
  19. 01
  20. 02
  21. 01
  22. 01
  23. 01
  24. 03
  25. 01
  26. 02
  27. 02
再对此数据结果进行统计

注意点:
        SQLSERVER的 [SUBSTRING](expression, start, length) 方法 其中的start位置是从1开始,而不是从0开始;
         [SUBSTRING](expression, expression[, start]) 方法 中的start位置也是从1开始,而不是从0开始
这些与C#等语言从0开始索引不同






郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。