cgprakash Ответов: 4

Как подсчитать количество отдельных текстов в столбце из всех записей


Хай,

Мне нужно отобразить количество каждого вхождения текста во всех строках из определенного столбца.

См. результат ниже:
-------------------------------------
Tags                |  Total        |
--------------------|---------------|
keyword.io          |     34        |
------------------------------------|
keywordtool.io ,    |     45        |
------------------------------------|
seobook.com ,       |     56        |
------------------------------------|
adwords.google.com  |     123       |
-------------------------------------

Мне нужно точно так же, как и выше.

Здесь у меня есть набор тегов, мне нужно отобразить count каждого тега в виде столбца в названии "Total"
Если хотите понять я выложил то же самое @ Угол C# с файлом исходного кода, пожалуйста, посетите его.
Пожалуйста, предложите свои вопросы, чтобы получить желаемый результат.

спасибо заранее.

Что я уже пробовал:

DECLARE @tags VARCHAR(8000) 
DECLARE @tot INT
select @tags = coalesce(@tags + ',' , ' ') + Labels from addNew 
select @tot = count(@tags)
select a.Labels as Tags,@tot as Total from addNew a 
inner join addNew n
on a.Labels = n.Labels
group by a.Labels


Я получил такой результат, как:
-------------------------------------
Tags                |  Total        |
--------------------|---------------|
keyword.io,,        |               |
keywordtool.io,     |      1        |
seobook.com,        |               |
Asp.Net             |               |
adwords.google.com  |               |
------------------------------------|
HtmlAgilityPack     |               |
library,            |               |
Parse Web Page,     |      1        |
Asp.Net,            |               |
Meta Descrition     |               |
------------------------------------|
seobook.com,        |               |
aptitude,           |               |
algebra,            |     1         |
------------------------------------|
adwords.google.com  |     1         |
-------------------------------------

4 Ответов

Рейтинг:
2

Santosh kumar Pithani

SELECT AN.Labels,
       Tag      , 
       Total  FROM AddNew AN 
 CROSS APPLY 
(
SELECT VALUE   as  Tag,
       count(*)as Total FROM string_split(AN.Labels,',') 
  GROUP BY VALUE
)AS ff 


Maciej Los

string_split(,) не является встроенной функцией sql. Итак, вы должны поделиться его содержанием.

Santosh kumar Pithani

Спасибо Maciej, некоторые старые версии не поддерживают String_split (,) для тех, кто ниже Ссылка-это помощь полная для создания функции String_split.
https://sqlperformance.com/2016/03/sql-server-2016/string-split.

Рейтинг:
0

Maciej Los

Проверить это:


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);
}


В обоих случаях результат один и тот же:
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


Удачи вам!


Рейтинг:
0

Santosh kumar Pithani

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')
select tag,count(*) as cnt from @tmp a 
 cross apply (
 select VALUE as tag  from string_split(a.Tags,',') 
 )as ff
group by tag;
Мой прошлый запрос принадлежит каждой строке, поэтому этот запрос для всех строк в столбце.
adwords.google.com	2
algebra	1
aptitude	1
Asp.Net	2
HtmlAgilityPack library	1
keyword.io	1
keywordtool.io	1
Meta Descrition	1
Parse Web Page	1
seobook.com	2


Рейтинг:
0

Santosh kumar Pithani

Select 
Labels as Tags ,
Count(1) as Total
from AddNew Group by Labels.


cgprakash

привет, Сантош, спасибо за ответ.
Что мне точно нужно, так это отобразить количество каждой метки во всех столбцах:
например:
рассмотрим в первой строке он содержит следующие значения:

LABELS
--------------------------------------
keyword, keyword , seobook , adwords |
--------------------------------------

В приведенном выше примере слово "ключевое слово" встречается два раза, а остальные-один раз.

результат, который мне нужен, таков:
TAGS    | TOTAL|
----------------
keywords| 2    |
seobook | 1    |
adwords | 1    |
----------------

Santosh kumar Pithani

Привет, Пракаш, я надеюсь, что ваша проблема теперь решена новым запросом.Спасибо Вам за то, что дали повтор.

Maciej Los

Извините, но ваше решение неверно. Вы должны разделить теги запятой, тогда вы сможете считать теги.

Santosh kumar Pithani

Вы выполнили этот запрос?

Maciej Los

Да, я пытался. Как я уже упоминал, это решение неверно. Он возвращается:

adwords.google.com 1
HtmlAgilityPack library,Parse Web Page,Asp.Net,Meta Descrition 1
keyword.io,keywordtool.io,seobook.com,Asp.Net,adwords.google.com 1
seobook.com,aptitude,algebra 1

вместо каждого тега отдельно.

Santosh kumar Pithani

я написал запрос в соответствии с вышеизложенным, что сделал Пракаш.