我有一列可以有許多名字。統計字符串內的實例數
我需要一種方法來:
- 1列:數名總數領域
- 列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 |
希望這是有道理的。
我有一列可以有許多名字。統計字符串內的實例數
我需要一種方法來:
數據的例子:
Row 1 || bob hope deloris steve mike ||
Row 2 || melbob melbetty steve ||
預期的反應會是:
| Column 1 | Column 2 |
Row 1 | 5 | 0 |
Row 2 | 3 | 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
我有一個可以在它有許多名稱列。
爲什麼?這違反了第一範式。
如果一個「名」是一個非空格字符任何叢,它們是由一個空格隔開,沒有前導空格,你可以使用
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)
您使用的是哪個版本的sql-server? –
你如何定義一個詞? 89,9是一個單詞?和dot.net? – sergiol
如果單詞分隔符只是空格,那麼可以按照https://msdn.microsoft.com/en-us/library/mt684588.aspx – sergiol