分拆统计字符串数据库教程

时间:2023-11-21 07:39:23 其他范文 收藏本文 下载本文

分拆统计字符串数据库教程(推荐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

Python教学心得

毕业论文关键词的选择

浩辰暖通设计教程:分户计量系统图功能介绍

Excel快速计算、统计混合编班考试成绩表EXCEL基本教程

从一个MysqL的例子来学习查询语句数据库教程

跨站脚本漏洞的利用教程

小技巧:用批处理对MySQL进行数据操作数据库教程

优化其索引的小技巧数据库教程

拼音处理数据库教程

python开发的小球完全弹性碰撞游戏代码

分拆统计字符串数据库教程
《分拆统计字符串数据库教程.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【分拆统计字符串数据库教程(推荐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