Check this:
DECLARE @tmp TABLE(Tags NVARCHAR(255))
INSERT INTO @tmp (Tags)
VALUES('keyword.io,keywordtool.io,seobook.com,Asp.Net,adwords.google.com'),
('HtmlAgilityPack library,Parse Web Page,Asp.Net,Meta Descrition'),
('seobook.com,aptitude,algebra'),
('adwords.google.com')
;WITH CTE AS
(
SELECT LEFT(Tags, CHARINDEX(',', Tags)-1) AS Tag, RIGHT(Tags, LEN(Tags)-CHARINDEX(',', Tags)) AS Remainder
FROM @tmp
WHERE CHARINDEX(',', Tags) >0
UNION ALL
SELECT LEFT(Remainder, CHARINDEX(',', Remainder)-1) AS Tag, RIGHT(Remainder, LEN(Remainder)-CHARINDEX(',', Remainder)) AS Remainder
FROM CTE
WHERE CHARINDEX(',', Remainder)>0
UNION ALL
SELECT Remainder As Tag, NULL AS Remainder
FROM CTE
WHERE CHARINDEX(',', Remainder)=0
)
SELECT Tag, COUNT(Tag) As CountOfTag
FROM CTE
GROUP BY Tag
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Tags", typeof(string)));
dt.Rows.Add(new object[]{"keyword.io,keywordtool.io,seobook.com,Asp.Net,adwords.google.com"});
dt.Rows.Add(new object[]{"HtmlAgilityPack library,Parse Web Page,Asp.Net,Meta Descrition"});
dt.Rows.Add(new object[]{"seobook.com,aptitude,algebra"});
dt.Rows.Add(new object[]{"adwords.google.com"});
var data = dt.AsEnumerable()
.SelectMany(v=>v.Field<string>("Tags").Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries))
.GroupBy(x=>x)
.Select(grp=> new
{
Tag = grp.Key,
Count = grp.Count()
});
foreach(var t in data)
{
Console.WriteLine("{0}\t{1}", t.Tag, t.Count);
}
In both cases the result is the same:
keyword.io 1
keywordtool.io 1
seobook.com 2
Asp.Net 2
adwords.google.com 2
HtmlAgilityPack library 1
Parse Web Page 1
Meta Descrition 1
aptitude 1
algebra 1
Good luck!