架构:
SubscriberId NewsletterIdCsv
------------ ---------------
1 48,51,94
2 43,22
3 33,11
4 90,61
我需要获取每行 NewsletterIdCsv 的计数,然后将所有行相加以获得所有行的总计数,对于基本行计数,我正在执行以下操作:
SELECT newsletteridcsv, len(newsletteridcsv) - len(replace(newsletteridcsv, ',', '')) +1 IndividualCount
FROM DBTABLE
这给了我结果:
NewsletterIdCsv IndividualCount
------------ ---------------
48,51,94 3
43,22 2
33,11 2
90,61 2
如何获得总计数(在本例中为 9)?
注意:该表有 500 万条记录,我不认为使用临时表插入计数,然后最终遍历临时表行来累积计数是一种优化方法吗? 另外我完全反对使用游标来解决效率问题!
获取总计数的最佳方法是什么?
SUM
将它们添加在一起:
SELECT SUM(len(newsletteridcsv) - len(replace(newsletteridcsv, ',', '')) +1)
AS TotalCount
FROM DBTABLE
由于您只是询问总数,因此您甚至不需要
GROUP BY
任何东西。
您已经完成了棘手的部分(len 减去逗号),现在只需计算其总和:
SELECT sum(len(newsletteridcsv) - len(replace(newsletteridcsv, ',', '')) +1) as TotalCount
FROM DBTABLE
更改函数 [dbo].[CountDelimited] (@Str varchar(8000),@Delimiter nvarchar(1)) 返回 varchar(8000) AS 开始 声明@Result int if (@Str ='' 或 @Str 为空) 开始 设置@Result = 0 结尾 别的 开始 设置@Result = (选择 SUM(len(@Str) - len(replace(@Str, @Delimiter, '')) +1)) 结尾 返回@结果 结束