IMOでは、このアプローチが困難です。ユーザーがタグを割り当てることを許可したからといって、タグを単語の単一の区切りリストとして格納する必要はありません。今、あなたの質問は些細なり
Create Table Posts (Id ... not null primary key)
Create Table Tags(Id ... not null primary key, Name ... not null Unique)
Create Table PostTags
(PostId ... not null References Posts(Id)
, TagId ... not null References Tags(Id))
:あなたのような何かに構造を正常化することができます
Select T.Id, T.Name, Count(*) As TagCount
From PostTags As PT
Join Tags As T
On T.Id = PT.TagId
Group By T.Id, T.Name
Order By Count(*) Desc
あなたが区切られた値として、タグを保存することを主張した場合、その後、唯一の解決策は、彼らの区切り文字に値を分割することですカスタムSplit関数を記述してカウントします。一番下はSplit関数の例です。それをあなたのクエリは、(カンマ区切り文字を使用して)次のようになります。
Select Tag.Value, Count(*) As TagCount
From Posts As P
Cross Apply dbo.Split(P.Tags, ',') As Tag
Group By Tag.Value
Order By Count(*) Desc
Split関数:あなたは言葉のセットにそれぞれ一文に含まを変換するために、文字列操作を使用する必要があるだろう
Create Function [dbo].[Split]
(
@DelimitedList nvarchar(max)
, @Delimiter nvarchar(2) = ','
)
RETURNS TABLE
AS
RETURN
(
With CorrectedList As
(
Select Case When Left(@DelimitedList, DataLength(@Delimiter)/2) <> @Delimiter Then @Delimiter Else '' End
+ @DelimitedList
+ Case When Right(@DelimitedList, DataLength(@Delimiter)/2) <> @Delimiter Then @Delimiter Else '' End
As List
, DataLength(@Delimiter)/2 As DelimiterLen
)
, Numbers As
(
Select TOP (Coalesce(Len(@DelimitedList),1)) Row_Number() Over (Order By c1.object_id) As Value
From sys.objects As c1
Cross Join sys.columns As c2
)
Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position
, Substring (
CL.List
, CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen
, Case
When CharIndex(@Delimiter, CL.list, N.Value + 1)
- CharIndex(@Delimiter, CL.list, N.Value)
- CL.DelimiterLen < 0 Then Len(CL.List)
Else CharIndex(@Delimiter, CL.list, N.Value + 1)
- CharIndex(@Delimiter, CL.list, N.Value)
- CL.DelimiterLen
End
) As Value
From CorrectedList As CL
Cross Join Numbers As N
Where N.Value < Len(CL.List)
And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter
)
を。文字列を受け取り、単語の表を出力するテーブル値関数を作成すると、 'myData CROSS APPLY myFunction(myTable.sentance)'を使用してGROUP BYを使ってすべてを数えることができます。文章を個々の言葉に分解するために必要な規則は、あなたや他の人に任せます:) – MatBailie