分拆统计字符串数据库教程(推荐7篇)由网友“九寨游子”投稿提供,下面小编为大家整理后的分拆统计字符串数据库教程,希望能帮助大家!
篇1:分拆统计字符串数据库教程
统计|字符串
在数据库表tbl1中有一个字段Keywords,它是nvarchar类型,长度为1000,该字段的内容是所要分析的论文的关键字id keywords -----------------------------------------------------------1 kw1;kw2;kw32 kw2;kw33 kw3;kw1;kw4
问题1,对于在keywords字段中出现的所有关键字集合(上例中关键字集合为{kw1,kw2,kw3,kw4})中的任意一个关键字,要统计它出现的次数(也就是包含该关键字的纪录的条数),然后写到另一张表中。最后的效果就是keywords count-------------------------kw1 2kw2 2kw3 3kw4 1
问题2。在此基础上,要进行组合查询。也就是说在整个关键字集合中任意抽出两个关键字,统计它们在数据库表纪录中同时出现的次数。对于上题,最后效果要是:keywords count----------------------------------kw1;kw2 1kw1;kw3 2kw1;kw4 1kw2;kw3 2kw2;kw4 0kw3;kw4 1
--------------------------------------------------------------------------------------
--统计示例
--为统计处理专门做的序数表select top 1000 id=identity(int,1,1) into 序数表 from syscolumns a,syscolumns balter table 序数表 add constraint pk_id_序数表 primary key(id)go
--示例数据create table tbl1(id int,keywords nvarchar(1000))insert tbl1 select 1,'kw1;kw2;kw3'union all select 2,'kw2;kw3'union all select 3,'kw3;kw1;kw4'go
--第一种统计(计数)select keyword=substring(a.keywords,b.id,charindex(';',a.keywords+';',b.id)-b.id) ,[count]=count(distinct a.id)from tbl1 a,序数表 bwhere b.id<=len(a.keywords) and substring(';'+a.keywords,b.id,1)=';'group by substring(a.keywords,b.id,charindex(';',a.keywords+';',b.id)-b.id)go
--第二种统计(组合统计)select keyword=substring(a.keywords,b.id,charindex(';',a.keywords+';',b.id)-b.id) ,[count]=count(distinct a.id),a.idinto #tfrom tbl1 a,序数表 bwhere b.id<=len(a.keywords) and substring(';'+a.keywords,b.id,1)=';'group by substring(a.keywords,b.id,charindex(';',a.keywords+';',b.id)-b.id),a.id
select keyword=a.keyword+';'+b.keyword,[count]=sum(case a.id when b.id then 1 else 0 end)from #t a,#t bwhere a.keyword drop table #tgo --删除测试环境drop table tbl1,序数表 /*--测试结果 --统计1keyword count ---------- --------kw1 2kw2 2kw3 3kw4 1 (所影响的行数为 4 行) --统计2keyword count ----------------------- -----------kw1;kw2 1kw1;kw3 2kw1;kw4 1kw2;kw3 2kw2;kw4 0kw3;kw4 1 (所影响的行数为 6 行)--*/
篇2:MS SQL Server2k字符串分拆与合并处理代码数据库教程
server|字符串
--MS SQL Server2k字符串分拆与合并处理代码
--字符串分拆处理代码
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS TABLE
AS
--SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR --字符串分拆函数要用到的辅助表.
--FROM syscolumns a,syscolumns b
RETURN(
SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))
FROM tb_splitSTR
WHERE ID<=LEN(@s+'a')
AND CHARINDEX(@split,@split+@s,ID)=ID)
--drop table tb_splitSTR
GO
/* --利用以上函数,对某一表的字符串字段字符分拆处理代码
declare @id int,@c varchar(50)
declare k cursor for select * from id_f --字符串待分拆原始表(id int,c varchar(50))
open k
fetch next from k into @id,@c
while (@@fetch_status=0)
begin
insert into id_yf --分拆结果表(id int,c varchar(50))
select @id as id,c.* from f_splitSTR(@c,',') as c
fetch next from k into @id,@c
end
close k
deallocate k
*/
--------------------------------------------------------------------------
--字符串合并处理代码
declare @s varchar(300)
set @s=''
SELECT @s=@s+c+','
FROM [dbo].[id_h] --字符串待合并表[id int,c varchar(50)]
where id (select top 1 id from id_h order by id desc) order by id
select @s=@s+ c from id_h where id =(select top 1 id from id_h order by id desc)
select @s
篇3:SQL分隔字符串的存储过程数据库教程
存储过程|字符串
我在做一个项目时研究了查询多个关键字的技术,这是其中用到的一个技术,SQL分隔字符串的存储过程数据库教程
。“分隔字符串”存储过程的作用就是把“jiangjs,shenxy,cheng”类的字符串隔开保存到一个表中。 CREATE PROCEDURE [分隔字符串](
@String NVARCHAR(1000), -- 要分隔的字符串
@SPLITCHAR NVARCHAR(10) = ',', -- 分隔字符
@TableName NVARCHAR(50), -- 存入的表名称
@FieldName NVARCHAR(50) = '[ID]' -- 存入的字段名称
)
AS -- 将字符串分隔开放进表中 DECLARE @L INT -- 第一个分隔字符的位置
DECLARE @S INT -- 第二个分隔字符的位置
SET @L = 0
SET @S = CHARINDEX(@SPLITCHAR, @String, @L) WHILE @L <= LEN(@String)
BEGIN
DECLARE @ID NVARCHAR(50) IF @S = 0 SET @S = LEN(@String) + 1 -- 如果到最后一个字符串那么第二个分隔字符的位置就是这个字符串的长度加一
SET @ID = SUBSTRING(@String, @L, @S - @L) -- 取值
SET @L = @S + 1
SET @S = CHARINDEX(@SPLITCHAR, @String, @L) IF LTRIM(RTRIM(@ID)) = '' CONTINUE -- 如果是空字符串就跳过 DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'INSERT INTO ' + @TableName + ' ('+ @FieldName +') VALUES(''' + @ID + ''')'
EXEC sp_executesql @SQL
END
GO ----------NotMSN Messenger : notking@hotmail.com
篇4:分组统计方法:用Group By数据库教程
分组|统计
原贴:community.csdn.net/Expert/topic/3739/3739565.xml?temp=.7632105
表中三个字段
|---------------------------------------------|
| 产品 数量 单价 |
|=============================================|
| A 3 20 |
| A 4 25 |
| A 2 30 |
| B 6 85 |
| B 3 96 |
|---------------------------------------------|
现在想得到以下结果:
产品 平均价
A ******
B ******
注意:一种商品一个平均价
平均数算法:
A的平均价数= (3 * 20)+ (4 * 25)+ (2 * 30)/(3+4+2),B的平均值也如A,
分组统计方法:用Group By数据库教程
,
求该SQL语句。
create table 表(产品 varchar(5),数量 int,单价 decimal(4,2))
insert 表 select 'A',3,20
union all select 'A',4,25
union all select 'A',2,30
union all select 'B',6,85
union all select 'B',3,96
select 产品,cast(sum(isnull(单价,0)*isnull(数量,0))/sum(数量) as decimal(4,2)) as '平均值' from 表 group by 产品
drop table 表
--结果:
(所影响的行数为 5 行)
产品 平均值
----- ------
A 24.44
B 88.67
(所影响的行数为 2 行)
篇5:SQL 中自己创建函数,分割字符串数据库教程
创建|函数|字符串
----------------------------------------------------------------
/**
* 版权: 石太祥 [ E.Alpha ] 所有 ;
*
* email: ealpha(AT)msn(DOT)com ;
* msn: ealpha(AT)msn(DOT)com ;
* QQ : 9690501
*
* 所有请注明本信息!
*/
----------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getEPnum]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[getEPnum]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getstrcount]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[getstrcount]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getstrofindex]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[getstrofindex]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--- 这个函数直接调用了另外的两个函数,可以先阅读下面提到的两个函数
CREATE function getEPnum (@str varchar(8000))
returns varchar(8000)
as
begin
declare @str_return varchar(8000)
declare @i int
declare @temp_i int
declare @onlineornot int
declare @findepnumok int
-- 用来取得一个epnum,
-- 规则:首先从chatid中取,如果有在线得,则取得最前面得在线得返回
-- 如果全部不在线,则返回 ‘00000000’
select @findepnumok = 0
select @temp_i = 0
IF len(@str)<=0
begin
SELECT @str_return = '00000000'
end
else
begin
select @i = dbo.getstrcount(@str,',')
WHILE @temp_i< @i
BEGIN
select @onlineornot = online from wwchat_user where epnum=dbo.getstrofindex(@str,',',@temp_i)
IF (@onlineornot=1)
begin
select @str_return =dbo.getstrofindex(@str,',',@temp_i)
select @findepnumok = 1 --找到epnum后置为1
BREAK
end
ELSE
begin
select @temp_i = @temp_i + 1
select @findepnumok = 0 --找不到epnum后置为1
end
END
if @findepnumok = 0
begin
SELECT @str_return = '00000000'
end
end
return @str_return
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- getstrcount 输入一个没有分割的字符串,以及分割符
--返回数组的个数
CREATE function getstrcount (@str varchar(8000),@splitstr varchar(100))
--returns varchar(8000)
returns int
as
begin
declare @int_return int
declare @start int
declare @next int
declare @location int
select @next = 0
select @location = 1
if len(@str)
select @int_return =0
if charindex(@splitstr,@str) = 0
select @int_return =0
while (@location0)
begin
select @start = @location + 1
select @location = charindex(@splitstr,@str,@start)
select @next = @next + 1
select @int_return = @next
end
return @int_return
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- getstrofindex 输入一个未分割的字符串,舒服分割符号,舒服要取得的字符位置
-- 返回 制定位置的字符串
CREATE function getstrofindex (@str varchar(8000),@splitstr varchar(4),@index int=0)
returns varchar(8000)
as
begin
declare @str_return varchar(8000)
declare @start int
declare @next int
declare @location int
select @start =1
select @next = 1 --如果习惯从0开始则select @next =0
select @location = charindex(@splitstr,@str,@start)
while (@location 0 and @index > @next )
begin
select @start = @location +1
select @location = charindex(@splitstr,@str,@start)
select @next =@next +1
end
if @location =0 select @location =len(@str)+1 --如果是因为没有逗号退出,则认为逗号在字符串后
select @str_return = substring(@str,@start,@location -@start) --@start肯定是逗号之后的位置或者就是初始值1
if (@index @next ) select @str_return = '' --如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1,
SQL 中自己创建函数,分割字符串数据库教程
,
return @str_return
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
篇6:模拟多级表头的分组统计数据库教程
分组|统计
原帖地址:
community.csdn.net/Expert/topic/3434/3434688.xml?temp=3.246486E-03
--测试数据
create table 单位表 (单位代码 varchar(10),单位名称 varchar(50))
insert 单位表 values('01' ,'中国单位') --1级
insert 单位表 values('0101' ,'山东单位') --2级
insert 单位表 values('010101' ,'山东济南单位') --3级
insert 单位表 values('010102' ,'山东青岛单位') --3级
insert 单位表 values('01010201','山东青岛即默单位一') --4级
insert 单位表 values('01010202','山东青岛即默单位二') --4级
insert 单位表 values('0102' ,'山西单位') --2级
insert 单位表 values('010201' ,'山西大同单位') --3级
insert 单位表 values('0103' ,'陕西单位') --2级
insert 单位表 values('010301' ,'陕西西安单位') --3级
--insert 单位表 values('01030101' ,'陕西西安A单位') --3级
--insert 单位表 values('0103010101' ,'陕西西安aa单位') --3级
insert 单位表 values('010302' ,'陕西咸阳单位') --3级
create table 供应表 (物资编号 varchar(10),物资名称 varchar(50),单位代码 varchar(10),供应数量 int)
insert 供应表 values('0001','电子称','010101',1)
insert 供应表 values('0002','电动机','010101',1)
insert 供应表 values('0001','电子称','01010201',1)
insert 供应表 values('0002','电动机','01010201',1)
insert 供应表 values('0001','电子称','010201',1)
insert 供应表 values('0003','电动刷','010201',1)
insert 供应表 values('0004','电动车','010302',1)
go
/*--要求
分级汇总,然后转置得到如下结果:
select '','','','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位','中国单位'
union all select '','','','山东单位','山东单位','山东单位','山东单位','山西单位','山西单位','陕西单位','陕西单位','陕西单位'
union all select '','','',' ',' ','山东青岛单位','山东青岛单位',' ',' ',' ',' ',' '
union all select '序号','装备名称','合计','小计','山东济南单位','山东青岛即默单位一','山东青岛即默单位二','小计','山西大同单位','小计','陕西西安单位','陕西咸阳单位'
union all select '','总计','7','4','2','2','','2','2','1','','1'
union all select '1','(0001)电子称','3','2','1','1','','1','1','','',''
union all select '2','(0002)电动机','2','2','1','1','','','','','',''
union all select '3','(0003)电动刷','1','','','','','1','1','','',''
union all select '4','(0004)电动车','1','','','','','','','1','','1'
统计结果说明:
1.单位代码固定每两位为1级
2.统计单位表中所有的最末级,如果该单位在供应表中无数据,则对应显示为0
3.小计是根据二级单位合并得到
4.结果中的表头是分级的,一级单位在第一行,二级单位在第二行,如果该单位已经在统计数据,即“序号','装备名称','合计'”这行出现,则不再在对应的级数的表头里面出现
--*/
--查询处理
declare @i varchar(10),@s11 varchar(8000),@s12 varchar(8000),@s13 varchar(8000)
,@s2 varchar(8000),@s3 varchar(8000),@s14 varchar(8000)
select @s11='',@s12='',@s13='',@s14=''
,@s2='',@s3=''
select a=left(单位代码,4),b=left(单位代码,len(单位代码)-2),c=len(单位代码)-2
into # from 单位表 b
where not exists(select * from 单位表 where 单位代码 like b.单位代码+'__')
order by 单位代码
select @i=max(len(b)) from #
while @i>'0'
select @s11=',@'+@i+' varchar(8000)'+@s11
,@s12=',@'+@i+'='''''''''','''''''','''''''''''+@s12
,@s13='
set @=null select @'+@i+'=@'+@i+'+case when @=a then '''' else '
+case when @i>'4' then ''','''''''''' end' else ''',''''''+单位名称+'''''''' end' end
+'+'',''''''+单位名称+'''''''',@=a from '
+case when @i<='4' then '# a,单位表 b where left(a.b,'+@i+')=b.单位代码'
else '(select 单位名称=case when a.c>='+@i+' then 单位名称 else '''' end,a.* from # a,单位表 b where left(a.b,'+@i+')=b.单位代码)a' end
+@s13
,@s14='+'' union all select ''+@'+@i+@s14
,@i=@i-2
select @s12=stuff(@s12,1,1,'')
,@s14=stuff(@s14,1,13,'')
select @s2=@s2+','''+case when len(b.单位代码)=4 then '小计' else b.单位名称 end+''''
,@s3=@s3+case
when len(b.单位代码)=4
then ',['+b.单位名称+'_小计]=cast(sum(case left(单位代码,4) when '''+b.单位代码+''' then 供应数量 else 0 end) as varchar)'
else ',['+b.单位名称+']=cast(sum(case 单位代码 when '''+b.单位代码+''' then 供应数量 else 0 end) as varchar)'
end
from 单位表 b
where len(单位代码)=4
or not exists(select * from 单位表 where 单位代码 like b.单位代码+'__')
order by 单位代码
set @s2=replace(@s2,'''','''''')
exec('
select 序号=cast('''' as varchar(10))
,装备名称=case
when grouping(物资编号)=1 then ''总计''
else ''(''+物资编号+'')''+物资名称 end
,供应数量=cast(sum(供应数量) as varchar)'+@s3+'
into #t
from 供应表
group by 物资编号,物资名称 with rollup
having grouping(物资名称)=0 or grouping(物资编号)=1
order by grouping(物资编号) desc
declare @i int
set @i=-1
update #t set @i=@i+1,序号=case when @i=0 then '''' else cast(@i as varchar) end
declare @ varchar(10)'+@s11+'
select '+@s12+'
'+@s13+'
exec('''+@s14+'+''
union all
select ''''序号'''',''''装备名称'''',''''合计'''''+@s2+'
union all
select * from #t
'')
drop table #
')
go
--删除测试
drop table 单位表,供应表
/*--测试结果(自己看)--*/
篇7:SQL里类似SPLIT的分割字符串函数数据库教程
函数|字符串
T-SQL对字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦,下边的函数,实现了象数组一样去处理字符串。
一,用临时表作为数组
create function f_split(@c varchar(2000),@split varchar(2))
returns @t table(col varchar(20))
as
begin
while(charindex(@split,@c)0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'')
end
insert @t(col) values (@c)
return
end
go
select * from dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk',',')
drop function f_split
col
--------------------
dfkd
dfdkdf
dfdkf
dffjk
(所影响的行数为 4 行)
二、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。
CREATE function Get_StrArrayLength
(
@str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1
while @location0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end
调用示例:select dbo.Get_StrArrayLength('78,1,2,3',',')
返回值:4
三、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便
CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1
--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号,
return substring(@str,@start,@location-@start)
end
调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)
返回值:9
三、结合上边两个函数,象数组一样遍历字符串中的元素
declare @str varchar(50)
set @str='1,2,3,4,5'
declare @next int
set @next=1
while @next<=dbo.Get_StrArrayLength(@str,',')
begin
print dbo.Get_StrArrayStrOfIndex(@str,',',@next)
set @next=@next+1
end
调用结果:
1
2
3
4
5
★ Excel快速计算、统计混合编班考试成绩表EXCEL基本教程
【分拆统计字符串数据库教程(推荐7篇)】相关文章:
存储过程替换text,ntext列中的字符串数据库教程2022-05-07
跟踪标记全攻略数据库教程2022-09-26
vba心得体会2022-05-03
如何恢复MYSQL实体文件MYI,MYD到数据库中数据库教程2022-05-04
阿里巴巴规章制度2023-08-15
Perl 脚本的特点数据库教程2022-09-28
KMCT分页控件与存储过程分页完美结合存储过程分页篇2022-12-24
Excel表格如何自动筛选动画教程2023-11-29
新手建站入门教程⑥:FlashFXP详细使用方法2023-03-13
存储过程实现分页2022-05-03