我需要在特定列的所有行上显示每个文本事件的计数。
见下面的结果:
这里我有一组标签,我需要在名称中显示每个标签的数量' 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
请建议您的查询以获得我想要的结果。
先谢谢。
答案 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;
注意:如果您使用的是 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;
希望它有所帮助!