0

TABLE の 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 になります (値の 1 つが空白であるため)。クエリをチェックインして除外するにはどうすればよいですか?空白?

編集 :

データ :

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

各行の合計だけでなく累積合計を取得する必要があるため、この上記のデータでは、空白を除いて最終カウント、つまりこの場合は 5 が必要です。

4

1 に答える 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 に答える