0

表的架构/数据:

SubscriberId NewsletterIdCsv
------------ ---------------
11           52,52,,52  

我们有这个非规范化数据,我需要计算逗号分隔值的数量,为此我正在这样做:

SELECT SUM(len(newsletteridcsv) - len(replace(rtrim(ltrim(newsletteridcsv)), ',','')) +1) as SubscribersSubscribedtoNewsletterCount
FROM TABLE
WHERE subscriberid = 11

结果 :

SubscribersSubscribedtoNewsletterCount
--------------------------------------
4

问题是我们的一些数据在逗号分隔值之间有空格/空格,如果我运行上述查询,预期结果应该是 3(因为其中一个值是空格),我如何检查我的查询以排除空格?

编辑 :

数据 :

SubscriberId NewsletterIdCsv
------------ ---------------
11           52,52,,52  
12           22,23

我需要得到一个累积的 SUM 而不是每行的总和,所以对于上面的数据,我只需要一个最终计数,即在这种情况下为 5,不包括空格。

4

1 回答 1

1

这是一种解决方案,尽管它们可能是一种更有效的方法:

SELECT A.[SubscriberId],  
  SUM(CASE WHEN Split.a.value('.', 'VARCHAR(100)') = '' THEN 0 ELSE 1 END) cnt
FROM  
(
   SELECT [SubscriberId],  
     CAST ('<M>' + REPLACE(NewsletterIdCsv, ',', '</M><M>') + '</M>' AS XML) AS String  
   FROM  YourTable
) AS A 
CROSS APPLY String.nodes ('/M') AS Split(a)
GROUP BY A.[SubscriberId]

还有SQL 小提琴

基本上它将您的 NewsletterIdCsv 字段转换为 XML,然后用于CROSS APPLY拆分数据。最后,使用CASE它来查看它是否为空白和SUM非空白值。或者,您可以构建一个 UDF 来做类似的事情。

于 2013-02-15T19:54:16.600 回答