2017-10-05 4 views
1

Je dois afficher le nombre de chaque occurrence de texte sur toutes les lignes d'une colonne particulière.Comment compter le nombre de texte individuel d'une colonne à partir de tous les enregistrements

Voir résultat ci-dessous:

enter image description here Ici, j'ai un ensemble de balises, je dois afficher le nombre chaque balise comme colonne dans le nom « Total »

Ce que je l'ai fait est:

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 

Le résultat doit être:

enter image description here
Obtenez le code de requête: individual_count_set.sql
S'il vous plaît suggérer vos questions pour obtenir le résultat souhaité.

Merci d'avance.

+0

La tâche semble facile si vous utilisez SQL Server 2016 version. Pouvez-vous s'il vous plaît ajouter la version de votre serveur sql? –

Répondre

1

Si vous utilisez des versions autres que SQL SERVER 2016, vous devez créer une fonction définie utilisateur de diviser ces chaînes séparées par des virgules.

La réponse entière est la suivante:

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 

Après avoir créé la fonction ci-dessus, après requête doit faire le travail:

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

Note: Si vous utilisez Sql Server 2016, alors vous pouvez utiliser la fonction intégrée STRING_SPLIT().

Pour plus d'informations click here

Solution pour 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; 

Hope it helps!