表的SCHEMA / DATA:
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,不包括空格。
答案 0 :(得分: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]
基本上它将您的NewsletterIdCsv字段转换为XML,然后使用CROSS APPLY
拆分数据。最后,使用CASE
查看是否为空,SUM
为非空值。或者,您可以构建一个UDF来执行类似的操作。