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

时间:2017-10-05 19:10:46

标签: sql sql-server linq join coalesce

我需要在特定列的所有行上显示每个文本事件的计数。

见下面的结果:

enter image description here 这里我有一组标签,我需要在名称中显示每个标签的数量' 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

结果必须是:

enter image description here
获取查询代码:individual_count_set.sql
请建议您的查询以获得我想要的结果。

先谢谢。

1 个答案:

答案 0 :(得分:1)

如果您使用的是 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;

希望它有所帮助!