求助动态参数组合统计表
数据表 T1
--------------
Id f1(人员) f2 (分数)
1 a 12
2 b 11
3 c 10
4 d 2
5 e 4
6 f 13
7 g 1
传入参数组合(格式)要求
a,b| c,d |e,f,g
第一组|第二组|第三组
要得到结果
-------------------
人 员 总得分 平均分
第一组 a, b 23 11.5
第二组 c, d 12 6
第一组 e,f,g 18 6
------解决方案--------------------写个函数,拆分存入的参数
------解决方案--------------------用存储过程实现,借助拆分函数。
/*
功能:实现split功能的函数
*/
create function fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)
while @i > = 1
begin
insert @temp values(left(@inputstr, @i - 1))
set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end
if @inputstr <> '\ '
insert @temp values(@inputstr)
return
end
go
------解决方案--------------------我写的是一个存储过程,不过没扩展到4个的组合,有必要楼主可以用这个方法自己扩展
create proc spgro
@pa nvarchar(20)= 'a,b|c,d|e,f,g ' --默认
as
declare @pa_n int,@str nvarchar(50)
select @pa=replace(@pa, ', ', ' ') --第一次初始化
select @str=@pa --定义可变字符串变量
select @pa_n=len(@pa)-len(replace(@pa, '| ', ' ')) --循环参数
declare @temptb table(id int identity(1,1),s_pa nvarchar(5)) --自定义数组
while (@pa_n> =0) begin --循环体
if charindex( '| ',@str) <> 0 insert into @temptb(s_pa) select left(@str,charindex( '| ',@str)-1)
else insert into @temptb(s_pa) select @str
select @str=right(@str,len(@str)-charindex( '| ',@str))
select @pa_n = @pa_n - 1
end --select * from @temptb
select a.*,b.f2+c.f2 总得分,cast((b.f2+c.f2) as float)/2 平均分 from @temptb a
inner join t1 b on b.f1=left(a.s_pa,1)
inner join t1 c on c.f1=right(a.s_pa,1)
where len(a.s_pa)=2
union all select a.*,b.f2+c.f2+d.f2 总得分,cast((b.f2+c.f2+d.f2) as float)/3 平均分 from @temptb a
inner join t1 b on b.f1=left(a.s_pa,1)
inner join t1 c on c.f1=right(a.s_pa,1)
inner join t1 d on d.f1=substring(a.s_pa,2,1)
where