2017-08-25 3 views
1

J'ai un tableau ci-dessousDélimité Texte Semi-Colon dans SQL avec Count cumulé

Program   FileCount 
B1    1 
A1;B2   2 
A2;B3   1 
A3;C1;B4   1 
A3;C2;D1;B5;B6 3 
C3;D2;B7   1 
B8;B9   2 
B8;B9   2 

Je suis seulement intéressé par le programme B et je voudrais prendre tout le programme B

Program FileCount 
B1   1 
B2   2 
B3   1 
B4   1 
B5   3 
B6   3 
B7   1 
B8   4 
B9   4 

S'il vous plaît Note:

  1. J'utilise Microsoft SQL Server 2012
  2. le nom du programme B ne sont pas uniformes avec 2 chiffres seulement mais varient (exemple, B1233456, B123)

J'ai utilisé la syntaxe ci-dessous mais elle ne donne pas ce dont j'ai besoin.

SELECT 

distinct CASE WHEN PATINDEX('%B%', Program)>0 THEN SUBSTRING(Program, PATINDEX('%B%', Program), 50) ELSE '' END as Program, 

sum(cast (Filecount as integer)) as FileCount 

FROM dbo.Database1 
where Program like '%B%' 
group by Program 

Merci beaucoup pour votre aide.

Cordialement,

Adhi

+0

double possible de [Délimité Fonction dans SQL aux données Répartie point-virgule] (https://stackoverflow.com/questions/45853527/delimited-function-in-sql-to-split-data-between-semi-colon) –

+0

ce n'est pas un doublon car cela a un problème plus compliqué concernant la valeur accumulée du fichier compter. –

Répondre

1

d'abord créer une fonction split sur mesure

 CREATE FUNCTION [dbo].[Split] 
     (
      @String NVARCHAR(4000), 
      @Delimiter NCHAR(1) 
     ) 
     RETURNS TABLE 
     AS 
     RETURN 
     (
      WITH Split(stpos,endpos) 
      AS(
       SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos 
       UNION ALL 
       SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1) 
        FROM Split 
        WHERE endpos > 0 
      ) 
      SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), 
       'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
      FROM Split 
     ) 

Que vous pouvez utiliser cette requête pour faire la sélection:

declare @t table (Program Varchar(max), Filecount integer) 

    insert into @t(Program , FileCount) 
    select 'B1 ', 1 
    union all select 'A1;B2', 2 
    union all select 'A2;B3', 1 
    union all select 'A3;C1;B4', 1 
    union all select 'A3;C2;D1;B5;B6', 3 
    union all select 'C3;D2;B7', 1 
    union all select 'B8;B9', 2 
    union all select 'B81;B9', 2 


    SELECT DISTINCT s.Data, t.Filecount 
    FROM @t t 
    CROSS APPLY dbo.Split(t.Program, ';') s 
    WHERE Data like 'B%' 
+0

AWESOME !! Merci Egbert.Je vais garder cette fonction.Vraiment apprécier. –

1

Ici vous allez. SQL Server 2016 a une nouvelle fonction split à utiliser lorsque j'utilise ssf_split. ma fonction ssf_split renvoie une table avec une colonne nommée Textline.

J'espère que c'est assez clair qu'il commence à être tard :)

declare @t table (Program Varchar(max), Filecount integer) 

insert into @t(Program , FileCount) 
     select 'B1   ', 1 
union all select 'A1;B2   ', 2 
union all select 'A2;B3   ', 1 
union all select 'A3;C1;B4  ', 1 
union all select 'A3;C2;D1;B5;B6', 3 
union all select 'C3;D2;B7  ', 1 
union all select 'B8;B9   ', 2 
union all select 'B8;B9   ', 2 


select X.textline as Program, sum(t.filecount) as FileCount from @t t 
Cross apply dbo.ssf_split(t.program,';') x where SUBSTRING(x.TextLine, 1,1) = 'b' 
Group by x.TextLine 
order by x.textline 

produira cette sortie:

Program    FileCount 
---------------------- ----------- 
B1      1 
B2      2 
B3      1 
B4      1 
B5      3 
B6      3 
B7      1 
B8      4 
B9      4 

donc la fonction 2016 est STRING_SPLIT (string, séparateur) et le nom de la colonne est Valeur. Remplacez donc dbo.ssf_split par STRING_SPLIT et textline avec la valeur et vous devriez être bon pour aller.

+0

Oui J'ai lu l'article concernant String_Split. Si seulement je peux l'utiliser dans SQL 2012 :(. –