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
请注意:
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%'