2013-02-11 157 views
4

模式:SQL逗号分隔字符串总数

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)?

注:此表有5百万条记录,我不认为使用临时表来插入计数,然后最终通过临时表行来累积计数是一种优化的方式? 另外我完全反对使用光标来提高效率!

获得总数的最佳方法是什么?

+3

你能标准化您的数据? – Taryn 2013-02-11 18:40:23

+6

“针对效率问题使用游标”,但数据的结构却非常低效。好奇的权衡 – billinkc 2013-02-11 18:43:35

+0

@billinkc由于我们预计有15亿行,所以规范化已经被考虑,尝试和测试,结果非常缓慢,这些只是我们准备最终数据的中间表。 – 2013-02-11 18:44:54

回答

6

您可以使用SUM将它们加在一起:

SELECT SUM(len(newsletteridcsv) - len(replace(newsletteridcsv, ',', '')) +1) 
    AS TotalCount 
FROM DBTABLE 

既然你只是在寻求总计数,你甚至都不需要任何GROUP BY

2

你已经做了棘手的部分(LEN减去逗号),现在只需要运行的,将一笔:

SELECT sum(len(newsletteridcsv) - len(replace(newsletteridcsv, ',', '')) +1) as TotalCount 
FROM DBTABLE 
+0

谢谢,因为@LittleBobbyTables首先回复我将不得不标记回答:) – 2013-02-11 19:14:05