2017-10-05 10 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 Serverのバージョンを追加できますか? –

答えて

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()を使用できます。詳細情報については

のSQL Server 2016用click here

ソリューション:

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; 

はそれが役に立てば幸い!

関連する問題