Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中带有累计计数的分隔分号文本_Sql_Sql Server_Delimited - Fatal编程技术网

SQL中带有累计计数的分隔分号文本

SQL中带有累计计数的分隔分号文本,sql,sql-server,delimited,Sql,Sql Server,Delimited,我有一张桌子在下面 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 我只对课程B感兴趣,我想参加所有的课程B Program FileCount B1 1 B2

我有一张桌子在下面

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
我只对课程B感兴趣,我想参加所有的课程B

Program    FileCount
B1         1
B2         2  
B3         1  
B4         1
B5         3
B6         3
B7         1
B8         4
B9         4  
请注意:

  • 我正在使用Microsoft SQL Server 2012
  • 程序B的名称不统一,只有两个数字,但不同(例如B1233456、B123)
  • 我使用了下面的语法,但是它没有给出我需要的

    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
    
    非常感谢你们的帮助

    亲切问候,


    Adhi

    给你。Sql server 2016在我使用ssf_split的地方使用了一个新的split函数。我的ssf_split函数返回一个表,其中一列名为Textline

    我希望这足够清楚,时间已经晚了:)

    将产生以下输出:

    Program                FileCount
    ---------------------- -----------
    B1                     1
    B2                     2
    B3                     1
    B4                     1
    B5                     3
    B6                     3
    B7                     1
    B8                     4
    B9                     4
    
    所以2016函数是STRING_SPLIT(STRING,separator),列名是Value


    因此,将dbo.ssf\u split替换为STRING\u split,并将textline替换为value,这样您就可以开始了。

    首先创建一个自定义拆分函数

            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
            )
    
    然后,您可以使用此查询进行选择:

        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%'
    

    可能的重复不是重复,因为这有一个关于文件计数累积值的更复杂的问题。是的,我读过关于字符串分割的文章。如果我能在SQL 2012中使用它就好了:(.AWESOME!!谢谢Egbert。我会保留这个函数。非常感谢。
        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%'