【问题标题】:Delimited Semi-Colon Text in SQL with Accumulated Count具有累积计数的 SQL 中的分隔分号文本
【发布时间】:2017-08-25 05:05:20
【问题描述】:

我在下面有一张桌子

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  

请注意:

  1. 我使用的是 Microsoft SQL Server 2012
  2. 程序 B 的名称不统一,只有 2 位数字,但有所不同(例如,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

非常感谢你们的帮助。

亲切的问候,

阿迪

【问题讨论】:

标签: sql sql-server delimited


【解决方案1】:

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

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

【讨论】:

  • 太棒了!谢谢埃格伯特。我会保留这个功能。真的很感激。
【解决方案2】:

给你。 Sql server 2016 有一个新的拆分功能,可以在我使用 ssf_split 的地方使用。我的 ssf_split 函数返回一个表,其中有一列名为 Textline。

我希望已经很晚了:)

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

将产生这个输出:

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

所以 2016 年的函数是 STRING_SPLIT(字符串,分隔符),列名是 Value。

因此,将 dbo.ssf_split 替换为 STRING_SPLIT 并将 textline 替换为 value,您应该一切顺利。

【讨论】:

  • 是的,我已阅读有关 String_Split 的文章。如果我能在 SQL 2012 中使用它就好了:(。
猜你喜欢
  • 2016-04-02
  • 2021-09-23
  • 2020-10-08
  • 2016-05-15
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2018-07-04
  • 2023-03-16
相关资源
最近更新 更多