insert into test
select 0,20,30
union all
select 10,0,0
union all
select 60,90,0
select sum(A)/sum(case when A=0 then 0 else 1 end) as AverageA,
sum(B)/sum(case when B=0 then 0 else 1 end) as AverageB,
sum(C)/sum(case when C=0 then 0 else 1 end)as AverageC
from test
create table T
(
a int,
b int,
c int
)
go
insert into T (a,b,c) values(0,20,30)
go
insert into T(a,b,c) values(10,0,0)
go
insert into T(a,b,c) values(60,90,0)
go
select sum(a)/sum(case a when 0 then 0 else 1 end) as a,
sum(b)/sum(case b when 0 then 0 else 1 end) as b,
sum(c)/sum(case c when 0 then 0 else 1 end) as c from T
go
大家可以试一下这种算法,这个问题不难!!!
declare @t table(A int,B int,C int)
insert into @t select 0,20,30
insert into @t select 10, 0, 0
insert into @t select 60,90, 0
select (sum(A)/(select count(A) from @t where A>0))AS A,(sum(B)/(select count(B) from @t where B>0))AS B,(sum(C)/(select count(C) from @t where C>0))AS C from @t
结果:
-------------------------
A B C
----------- ----------- -----------
35 55 30
select case sum(a) when 0 then 0 else sum(a)/sum(case a when 0 then 0 else 1 end) end as a,
case sum(b) when 0 then 0 else sum(b)/sum(case b when 0 then 0 else 1 end) end as b,
case sum(c) when 0 then 0 else sum(c)/sum(case c when 0 then 0 else 1 end) end as c,
from t
select (sum(A)/(select count(A) from tablename where A>0))AS A,(sum(B)/(select count(B) from tablename where B>0))AS B,(sum(C)/(select count(C) from tablename where C>0))AS C from tablename
declare @t table(A int,B int,C int)
insert into @t select 0,20,30
insert into @t select 10, 0, 0
insert into @t select 60,90, 0
select
sum(A)/(case sum(case A when 0 then 0 else 1 end) when 0 then 1 else sum(case A when 0 then 0 else 1 end) end) as A,
sum(B)/(case sum(case B when 0 then 0 else 1 end) when 0 then 1 else sum(case B when 0 then 0 else 1 end) end) as B,
sum(C)/(case sum(case C when 0 then 0 else 1 end) when 0 then 1 else sum(case C when 0 then 0 else 1 end) end) as C
from
@t
/*
A B C
----------- ----------- -----------
35 55 30
*/
select sum(a)/(select count(*) from abc where a<>0) as avg_a,
sum(b)/(select count(*) from abc where b<>0) as avg_b,
sum(c)/(select count(*) from abc where c<>0) as avg_c
from abc
select
sum(A)/(case sum(case A when 0 then 0 else 1 end) when 0 then 1 else sum(case A when 0 then 0 else 1 end) end),
sum(B)/(case sum(case B when 0 then 0 else 1 end) when 0 then 1 else sum(case B when 0 then 0 else 1 end) end),
sum(C)/(case sum(case C when 0 then 0 else 1 end) when 0 then 1 else sum(case C when 0 then 0 else 1 end) end)
from
T