如何计算所有记录中列中的单个文本数

How do I count individual text count from a column from all records

我需要显示特定列中所有行上每个文本出现的次数。

查看以下结果:

这里我有一组标签,我需要将每个标签显示为名称中的列 'Total'

我所做的是:

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

结果必须是:


获取查询码:individual_count_set.sql
请提出您的问题以获得我想要的结果。

提前致谢。

如果您使用的版本不是SQL SERVER 2016,您需要创建一个用户定义函数来拆分这些逗号分隔的字符串。

完整答案如下:

Go

CREATE FUNCTION [dbo].StringSplit
(
    @Labels varchar(8000)
)
RETURNS @RESULT TABLE(Value VARCHAR(8000))
AS
BEGIN     
 DECLARE @SeparatorPosition INT = CHARINDEX(',', @Labels ),
        @Value VARCHAR(8000), @StartPosition INT = 1

 IF @SeparatorPosition = 0  
  BEGIN
   INSERT INTO @RESULT VALUES(@Labels)
   RETURN
  END

 SET @Labels = @Labels + ','
 WHILE @SeparatorPosition > 0
  BEGIN
   SET @Value = SUBSTRING(@Labels , @StartPosition, @SeparatorPosition- @StartPosition)

   IF( @Value <> ''  ) 
    INSERT INTO @RESULT VALUES(@Value)

   SET @StartPosition = @SeparatorPosition + 1
   SET @SeparatorPosition = CHARINDEX(',', @Labels , @StartPosition)
  END    

 RETURN
END
Go

创建上述函数后,执行以下查询即可完成工作:

select concat(fn.Value,'(',count(fn.Value),')') as TagCount 
from addnew a
 cross apply
   STRINGSPLIT(a.Labels) as fn
 group by fn.Value
 order by TagCount;

Working Example

注意:如果您使用的是 Sql Server 2016,那么您可以使用内置函数 STRING_SPLIT().

更多信息click here

SQL SERVER 2016 的解决方案:

select concat(fn.Value,'(',count(fn.Value),')') as TagCount 
    from addnew a
     cross apply
       STRING_SPLIT(a.Labels) as fn  //use in-built function, no need to create UDF
     group by fn.Value
     order by TagCount;

希望对您有所帮助!