2017-10-05 11 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 서버 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 서버 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; 

는 희망이 도움이!