经典的一个SQL题目(50)

  • 主题发起人 主题发起人 tom_zhxc1794
  • 开始时间 开始时间
T

tom_zhxc1794

Unregistered / Unconfirmed
GUEST, unregistred user!
表dm sl 01,02,03 1 02,03,04 2要求出来的结果01 102 303 304 2用游标可以实现,可不想用,有什么办法
 
不用游標或者循環,不好做吧。
 
02,03,04;一个字段里的东东,不知道怎么搞,帮顶!~
 
如果dm中的长度固定的话,可以用select dm,count(dmsl) Form (select 前2个字符 dm,count( 前2个字符) dmslunionselect 中2个字符 dm,count(中2个字符) dmslunionselect 后2个字符 dm,count(后2个字符) dmsl)group by dm
 
循環可以用,游标在数据量大时效率不怎么好吧。xnnfan的回答对于这些数据可以解决问题但局限性很大。如果是里面有4个内容01,02,03,04就不行了,而里面的数据的个数是不确定的。我试着用游标写了下,可以实现,说实话不太想用这种方法。declare @dm varchar(20),@sl numeric(18,4),@i int,--开始复制的位置@j int--循环的判断条件declare abc cursor for select * from testcreate table #temp(dm varchar(20), sl numeric(18,4))open abcfetch next from abcinto @dm,@slwhile @@FETCH_STATUS = 0beginset @i=1 select @j=CHARINDEX(',',@dm,@i)if @j=0 begin insert into #temp values(@dm,@sl)endelsebeginwhile @j<>0begin insert into #temp values(substring(@dm,@i,CHARINDEX(',',@dm,@i)-@i),@sl) select @i=CHARINDEX(',',@dm,@i)+1 select @j=CHARINDEX(',',@dm,@i) if @j=0 begin insert into #temp values(substring(@dm,@i,len(@dm)),@sl) endendendfetch next from abcinto @dm,@slendclose abcdeallocate abcselect dm,sum(sl) as sl from #temp group by dmdrop table #temp
 
在sqlserver中自定义split函数
 
函数是个好的思路,函数也是可以一行一行处理的,至于你提到的SPLIT不太清楚指的是什么,有时间用函数写一下用函数怎么实现,我也试着写一下.
 
多人接受答案了。
 
后退
顶部