如何求变化列的平均值?
目前表结构:
bh, xm, cl1,wcl1,cl2,wcl2,cl3, wcl3, cl4, wcl4.........
1 test 50 1.03 40 0.98 80 0.99 160 1.10
2 test2 25 0.51 80 1.96
该表的字段是变化的,也就是说后面还可能有cl5,wcl5 等等字段,每个人(即每条记录的)也可能如test2那样,只有几个值,后面为null值。我现在想要产生一个字段,以显示wlc1,wcl2...所有以wcl开头的字段的平均值。
请教sql语句该怎么写?
------解决方案----------------------这回处理了遇到被零除错误。
create table tab(bh int, xm varchar(10),cl1 decimal(9,2),wcl1 decimal(9,2),cl2 decimal(9,2),wcl2 decimal(9,2),cl3 decimal(9,2), wcl3 decimal(9,2), cl4 decimal(9,2), wcl4 decimal(9,2))
insert tab
select 1 , 'test ' , 50 ,1.03 ,40 , 0.98 , 80 , 0.99 , 160 , 1.10
union select 2 , 'test2 ' ,25 ,0.51 ,80 , 1.96 ,null,null ,null ,null
union select 3 , 'test3 ' ,25 ,null ,80 , null ,null,null ,null ,null
declare @str varchar(8000),@str1 varchar(8000)
select @str= ' ' , @str1= ' '
select @str=@str+ '+isnull( '+name+ ',0) ',@str1=@str1+ '+( '+ 'select case when '+name+ ' is not null then 1 else 0 end from tab where bh=t.bh '+ ') ' from syscolumns where object_name(id)= 'tab ' and charindex( 'wcl ',name)> 0 group by name
set @str= 'select bh,[avg]=( '+stuff(@str,1,1, ' ')+ ')/case when ( '+stuff(@str1,1,1, ' ')+ ')=0 then 1 else ( '+stuff(@str1,1,1, ' ')+ ') end from tab t '
exec(@str)
drop table tab
/* 结果
(3 row(s) affected)
bh avg
----------- -------------------------
1 1.0250000000000
2 1.2350000000000
3 .0000000000000
*/