首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

动态参数组合统计表

2012-01-21 
求助动态参数组合统计表 数据表T1--------------Idf1(人员)f2(分数)1a122b113c104d25e46f137g1传入参数组

求助动态参数组合统计表

数据表     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 len(a.s_pa)=3 --还可以继续扩展




exec spgro 'a,b|c,d,e|b,d,g|a,f '

显示
1ab2311.5
4af2512.5
3bdg144.666666666666667
2cde165.333333333333333

有问题大家继续交流啊~~谢谢先~~~~~

[解决办法]
create table tb(id varchar(10) , code varchar(10))
create table T1(id int , f1 varchar(10), f2 decimal(18,2))
insert into t1(id,f1,f2) values(1, 'a ', 12)
insert into t1(id,f1,f2) values(2, 'b ', 11)
insert into t1(id,f1,f2) values(3, 'c ', 10)
insert into t1(id,f1,f2) values(4, 'd ' , 2)
insert into t1(id,f1,f2) values(5, 'e ', 4)
insert into t1(id,f1,f2) values(6, 'f ', 13)
insert into t1(id,f1,f2) values(7 , 'g ', 1)
go

declare @str varchar(4000)
declare @tmpstr varchar(10)
set @str= 'a,b|c,d|e,f,g ' + '| '
set @tmpstr= ' '
declare @i int
set @i=0
declare @j int
set @j=0

while @i <len(@str)
begin
set @i=@i+1
if SUBSTRING(@str,@i,1)= '| '
begin
set @j = @j + 1
insert tb(id , code) values( '第 ' + cast(@j as varchar) + '组 ' , left(@str,@i-1))
set @str=SUBSTRING(@str,@i+1,len(@str))
set @i=0
end
end

select t.id as 组别, t.code as 人员 , sum(t.f2) as 总得分 , cast(avg(t.f2) as decimal(18,2)) as 平均分 from
(
select t1.f1,t1.f2,tb.* from t1 , tb where charindex(t1.f1, tb.code) > 0
) t
group by id , code

drop table tb,t1
/*
组别 人员 总得分 平均分
---------- ---------- ------- --------------------
第1组 a,b 23.00 11.50
第2组 c,d 12.00 6.00
第3组 e,f,g 18.00 6.00

(所影响的行数为 3 行)
*/

热点排行