create table answer ( 用户名 varchar(5), 回答内容 varchar(10) ) insert into answer select 'aa','a,b,c' union all select 'bb','a' union all select 'cc','a,b,d' go CREATE FUNCTION dbo.f_getnum( @s varchar(8000), --待分拆的字符串 @split varchar(10) --数据分隔符 )RETURNS int AS BEGIN DECLARE @splitlen int declare @rtn int set @rtn=0 SET @splitlen=LEN(@split+'a')-2 WHILE CHARINDEX(@split,@s)>0 BEGIN set @rtn=@rtn+1 SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'') END set @rtn=@rtn+1 RETURN @rtn END GO select a.用户名,b.选项, case when charindex(b.选项,a.回答内容)>0 then 1 else 0 end 次数,dbo.f_getnum(a.回答内容,',') 总选次数 from answer a inner join (select 用户名,'b' as 选项 from answer) b on a.用户名=b.用户名 --结果 用户名 选项 次数 总选次数 ----- ---- ----------- ----------- aa b 1 3 bb b 0 1 cc b 1 3(3 行受影响)
drop table answer go create table answer(用户名 varchar(10),回答内容 varchar(20)) insert into answer select 'aa','a,b,c' union all select 'bb','a' union all select 'cc','a,b,d'select 用户名, 'b' as 选项, len(回答内容)-len(replace(回答内容,'b','')) as 次数, len(replace(回答内容,',','')) as 总选次数 from answer /* 用户名 选项 次数 总选次数 ---------- ---- ----------- ----------- aa b 1 3 bb b 0 1 cc b 1 3(所影响的行数为 3 行) */
表answer 用户名 问题号 回答内容 aa 1 a,b,c aa 2 fef bb 1 a bb 2 fgg cc 1 a,b,d cc 2 ffds如果数据多了统计结果会不对 看下图用户名 选项 次数 总选次数 ---------- ---- ----------- ----------- aa b 2 6 aa b 0 4另外我想只对问题1 进行统计 怎么搞
drop table answer go create table answer(用户名 varchar(10),回答内容 varchar(20)) insert into answer select 'aa','a,b,c' union all select 'bb','a' union all select 'cc','a,b,d' union all select 'aa','fef' union all select 'bb','fgg' union all select 'cc','ffds' go create function f_str1(@name varchar(10),@fh varchar(10)) returns int as begin declare @ret varchar(400) declare @i int set @i=0 set @ret='' select @ret=@ret+rtrim(回答内容)+',' from answer where 用户名=@namewhile charindex(@fh,@ret)>0 begin set @i=@i+1 set @ret=stuff(@ret,1,charindex(@fh,@ret),'') end return @i end go select distinct 用户名,dbo.f_str1(用户名,'b') 次数,dbo.f_str1(用户名,',') 总次数 from answer aa 1 4 bb 0 2 cc 1 4我把楼上的总结了以下
能不能根据问题1 进行统计 得到aa 1 3 bb 0 1 cc 1 3
create function f_str2(@name varchar(10),@fh varchar(10),@bh varchar(10)) returns int as begin declare @ret varchar(400) declare @i int set @i=0 set @ret='' select @ret=@ret+rtrim(回答内容)+',' from answer where 用户名=@name and 问题号=@bhwhile charindex(@fh,@ret)>0 begin set @i=@i+1 set @ret=stuff(@ret,1,charindex(@fh,@ret),'') end return @i end go select distinct 用户名,dbo.f_str2(用户名,'b','1') 次数,dbo.f_str2(用户名,',','1') 总次数 from answer aa 1 3 bb 0 1 cc 1 3呵呵
改成两个函数 create table answer ( 用户名 varchar(5), 回答内容 varchar(10) ) insert into answer select 'aa','a,b,c' union all select 'bb','a' union all select 'cc','a,b,d' go CREATE FUNCTION dbo.f_getnum( @s varchar(8000), --待分拆的字符串 @split varchar(10) --数据分隔符 )RETURNS int AS BEGIN DECLARE @splitlen int declare @rtn int set @rtn=0 SET @splitlen=LEN(@split+'a')-2 WHILE CHARINDEX(@split,@s)>0 BEGIN set @rtn=@rtn+1 SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'') END set @rtn=@rtn+1 RETURN @rtn END GO CREATE FUNCTION dbo.f_getcs( @str varchar(10), @s varchar(50) )RETURNS int AS BEGINdeclare @rtn int set @rtn=0 while charindex(','+@str+',',','+@s+',')>0 begin set @rtn=@rtn+1 set @s=stuff(@s,1,charindex(','+@str+',',','+@s+','),'') end return @rtn END GO select a.用户名,b.选项, dbo.f_getcs(b.选项,a.回答内容) 次数,dbo.f_getnum(a.回答内容,',') 总选次数 from answer a inner join (select 用户名,'b' as 选项 from answer) b on a.用户名=b.用户名 --结果 用户名 选项 次数 总选次数 ----- ---- ----------- ----------- aa b 1 3 bb b 0 1 cc b 1 3(3 行受影响)
(
用户名 varchar(5),
回答内容 varchar(10)
)
insert into answer
select 'aa','a,b,c' union all
select 'bb','a' union all
select 'cc','a,b,d'
go
CREATE FUNCTION dbo.f_getnum(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS int
AS
BEGIN
DECLARE @splitlen int
declare @rtn int
set @rtn=0
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
set @rtn=@rtn+1
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
set @rtn=@rtn+1
RETURN @rtn
END
GO
select a.用户名,b.选项, case when charindex(b.选项,a.回答内容)>0 then 1 else 0 end 次数,dbo.f_getnum(a.回答内容,',') 总选次数 from answer a
inner join
(select 用户名,'b' as 选项 from answer) b
on a.用户名=b.用户名
--结果
用户名 选项 次数 总选次数
----- ---- ----------- -----------
aa b 1 3
bb b 0 1
cc b 1 3(3 行受影响)
go
create table answer(用户名 varchar(10),回答内容 varchar(20))
insert into answer
select 'aa','a,b,c'
union all select 'bb','a'
union all select 'cc','a,b,d'select 用户名,
'b' as 选项,
len(回答内容)-len(replace(回答内容,'b','')) as 次数,
len(replace(回答内容,',','')) as 总选次数
from answer
/*
用户名 选项 次数 总选次数
---------- ---- ----------- -----------
aa b 1 3
bb b 0 1
cc b 1 3(所影响的行数为 3 行)
*/
用户名 问题号 回答内容
aa 1 a,b,c
aa 2 fef
bb 1 a
bb 2 fgg
cc 1 a,b,d
cc 2 ffds如果数据多了统计结果会不对
看下图用户名 选项 次数 总选次数
---------- ---- ----------- -----------
aa b 2 6
aa b 0 4另外我想只对问题1 进行统计 怎么搞
go
create table answer(用户名 varchar(10),回答内容 varchar(20))
insert into answer
select 'aa','a,b,c'
union all select 'bb','a'
union all select 'cc','a,b,d'
union all select 'aa','fef'
union all select 'bb','fgg'
union all select 'cc','ffds'
go
create function f_str1(@name varchar(10),@fh varchar(10))
returns int
as
begin
declare @ret varchar(400)
declare @i int
set @i=0
set @ret=''
select @ret=@ret+rtrim(回答内容)+',' from answer where 用户名=@namewhile charindex(@fh,@ret)>0
begin
set @i=@i+1
set @ret=stuff(@ret,1,charindex(@fh,@ret),'')
end
return @i
end
go
select distinct 用户名,dbo.f_str1(用户名,'b') 次数,dbo.f_str1(用户名,',') 总次数 from answer
aa 1 4
bb 0 2
cc 1 4我把楼上的总结了以下
bb 0 1
cc 1 3
returns int
as
begin
declare @ret varchar(400)
declare @i int
set @i=0
set @ret=''
select @ret=@ret+rtrim(回答内容)+',' from answer where 用户名=@name and 问题号=@bhwhile charindex(@fh,@ret)>0
begin
set @i=@i+1
set @ret=stuff(@ret,1,charindex(@fh,@ret),'')
end
return @i
end
go
select distinct 用户名,dbo.f_str2(用户名,'b','1') 次数,dbo.f_str2(用户名,',','1') 总次数 from answer
aa 1 3
bb 0 1
cc 1 3呵呵
create table answer
(
用户名 varchar(5),
回答内容 varchar(10)
)
insert into answer
select 'aa','a,b,c' union all
select 'bb','a' union all
select 'cc','a,b,d'
go
CREATE FUNCTION dbo.f_getnum(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS int
AS
BEGIN
DECLARE @splitlen int
declare @rtn int
set @rtn=0
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
set @rtn=@rtn+1
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
set @rtn=@rtn+1
RETURN @rtn
END
GO
CREATE FUNCTION dbo.f_getcs(
@str varchar(10),
@s varchar(50)
)RETURNS int
AS
BEGINdeclare @rtn int
set @rtn=0
while charindex(','+@str+',',','+@s+',')>0
begin
set @rtn=@rtn+1
set @s=stuff(@s,1,charindex(','+@str+',',','+@s+','),'')
end
return @rtn
END
GO
select a.用户名,b.选项, dbo.f_getcs(b.选项,a.回答内容) 次数,dbo.f_getnum(a.回答内容,',') 总选次数 from answer a
inner join
(select 用户名,'b' as 选项 from answer) b
on a.用户名=b.用户名
--结果
用户名 选项 次数 总选次数
----- ---- ----------- -----------
aa b 1 3
bb b 0 1
cc b 1 3(3 行受影响)
set @ret=stuff(@ret,1,charindex(@fh,@ret),'') 这句里面的 1 是不是就是 问题号