表answer
用户名   回答内容
aa        a,b,c
bb        a
cc        a,b,d
统计出 
用户名   选项   次数   总选次数
aa        b      1       3
bb        b      0       1
cc        b      1       3

解决方案 »

  1.   

    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 行受影响)
      

  2.   

    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 行)
    */
      

  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 进行统计 怎么搞
      

  4.   

    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我把楼上的总结了以下
      

  5.   

    能不能根据问题1 进行统计 得到aa 1 3
    bb 0 1
    cc 1 3
      

  6.   

    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呵呵
      

  7.   

    改成两个函数
    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 行受影响)
      

  8.   

    楼上的大哥 那个function f_str2 怎么释放掉 只能执行一次的
    set @ret=stuff(@ret,1,charindex(@fh,@ret),'') 这句里面的 1 是不是就是 问题号