日期:2014-05-17  浏览次数:20403 次

高分在线求:如何用SQL统计行中的重复内容
比如如下表:  

论文题目 作者
A 张三,李四,王五
B 张三,李四
C 李四

利用SQL语句输出如下结构:


作者名 篇数
李四 3
张三 2
王五 1

------解决方案--------------------
SQL code

if object_id('A') is not null drop table A
create table A(
论文题目 nvarchar(20),
作者 nvarchar(100)
)
go
insert into A
    select 'A','张三,李四,王五'
union all select 'B','张三,李四'
union all select 'C','李四'
go
if objectproperty(object_id('splitstr'),'IsTableFunction')=1
drop function dbo.splitstr
go
create function dbo.splitstr(@str nvarchar(max),@split varchar(10))
returns @t table(val nvarchar(10))
as
begin    
declare @i int,@s int    
select @i=1,@s=1    
while(@i>0)    
begin            
    set @i=charindex(@split,@str,@s)        
    if(@i>0)       
    begin            
        insert @t(val) values(substring(@str,@s,@i-@s))        
    end           
    else 
    begin            
        insert @t(val) values(substring(@str,@s,len(@str)-@s+1))        
    end        
    set @s = @i + 1       
end    
return
end
go
if objectproperty(object_id('GetSplitResults'),'IsProcedure')=1
drop procedure GetSplitResults
go
create procedure GetSplitResults
as
if object_id('#t') is not null drop table #t
create table #t(
id int identity(1,1),
author nvarchar(20)
)
declare @author nvarchar(100)
declare cur cursor local for select 作者 from A
open cur
fetch next from cur into @author
while @@fetch_status=0
begin
    insert into #t select * from dbo.splitstr(@author,',')
    fetch next from cur into @author
end
close cur
deallocate cur
select 作者名=author,篇数=count(1) from #t group by author order by 篇数 desc
drop table #t
go
exec GetSplitResults