2017-10-05 101 views
1

我需要顯示特定列中所有行上的每個文本出現次數。如何計算來自所有記錄的列中的單個文本計數

下面

見結果:

enter image description here 我這裏有一組標籤的,我需要顯示計算每個標籤作爲名稱中的「合計」

我所做的是柱:

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
請推薦您的查詢以獲得我想要的結果。

感謝提前。

+0

如果您使用的是sql server 2016版本,該任務看起來很簡單。你可以請添加你的SQL服務器的版本? –

回答

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; 

希望它能幫助!