2016-12-01 39 views
2

我有一列可以有許多名字。統計字符串內的實例數

我需要一種方法來:

  1. 1列:數名總數領域
  2. 列2:計數在與「梅爾」開頭的字段名稱的數量。

數據的例子:

Row 1 || bob hope deloris steve mike || 
Row 2 || melbob melbetty steve  || 

預期的反應會是:

 | Column 1 | Column 2 | 
Row 1 |  5 |  0 | 
Row 2 |  3 |  2 | 

希望這是有道理的。

+0

您使用的是哪個版本的sql-server? –

+0

你如何定義一個詞? 89,9是一個單詞?和dot.net? – sergiol

+0

如果單詞分隔符只是空格,那麼可以按照https://msdn.microsoft.com/en-us/library/mt684588.aspx – sergiol

回答

2

與交叉的幫助下應用和一些XML來分割字符串

Declare @YourTable Table (ID int,YourField varchar(500)) 
Insert Into @YourTable values 
(1,'bob hope deloris steve mike'), 
(2,'melbob melbetty steve') 

Select A.ID 
     ,AnswerA = Count(*) 
     ,AnswerB = Sum(case when RetVal Like 'mel%' then 1 else 0 end) 
From @YourTable A 
Cross Apply (
      Select RetSeq = Row_Number() over (Order By (Select null)) 
        ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
      From (Select x = Cast('<x>'+ Replace(A.YourField,' ','</x><x>')+'</x>' as xml).query('.')) as A 
      Cross Apply x.nodes('x') AS B(i) 
    ) B 
Group By ID 

返回

ID AnswerA AnswerB 
1 5  0 
2 3  2 

編輯 - 只是爲了幫助您可視化這一點更好

選擇*不帶GROUP BY會產生以下內容。現在,通常我使用CROSS APPLY內的代碼作爲TVF(表值函數)。

ID RetSeq RetVal 
1 1  bob 
1 2  hope 
1 3  deloris 
1 4  steve 
1 5  mike 
2 1  melbob 
2 2  melbetty 
2 3  steve 
3

我有一個可以在它有許多名稱列。

爲什麼?這違反了第一範式。

如果一個「名」是一個非空格字符任何叢,它們是由一個空格隔開,沒有前導空格,你可以使用

Select ID, 
     SIGN(L) + L -LEN(REPLACE(YourField,' ','')), 
     (1 + L -LEN(REPLACE(' ' + YourField,' Mel','')))/4 
From @YourTable 
CROSS APPLY (SELECT Len(YourField)) C(L) 

(從對方的回答借鑑的樣本數據http://rextester.com/KPHAC50383

+1

Plus1更好...更聰明...更快 –

+1

感謝rextester鏈接! – sergiol

+0

差不多。不區分單個標記和空字符串。 –

相關問題