2017-05-03 71 views
0

我有一个正在处理数千行的SQL Server查询。然而,脚本运行良好,但我需要仅将其中一个选择语句应用于条件,但不会影响其余结果。在select查询中排除SQL

Select 
    Count ([key]) as KEYCOUNT, 
    Round (AVG ([AGE]),2) as AGE, 
    Round (AVG ([LENGTH]),2) as Length_X, 
    Round (AVG ([Duration]),2) as DUR_Y, 
from 
    [dbo].[XYZ] 
where 
    [FLAG] = 1 and STAT = 3 

的选择我需要影响是Round (AVG ([LENGTH]),2) as Length_X,我需要计算作为平均只有那些大于0的长度,基本上不包括全部为0(零)

帮助非常感谢

干杯

+0

如果你的0实际上代表了应该忽略的值(即0不是一个有效的值被认为是平均值的一部分),它们不应该是NULL吗? – ADyson

回答

1

可以使用case表达为AVG函数的参数:

Round(AVG(case when [LENGTH] > 0 then [LENGTH] end), 2) as Length_X, 

这样,所有0值都将被AVG忽略,而查询中的所有其他表达式都不会受到影响。

+0

谢谢你。完美工作 – HAS

0

我需要计算作为平均只有那些大于0的长度,基本上不包括全部为0(零)

这仅仅是总和(长度)/ SUM(壳体长度那么当0 0否则1结束),如果需要的话可以进行适当的铸造。例如。

set nocount on; 
with cte as (select * from (values (0), (1), (2), (1), (0), (0)) as l(length)) 
select avg(cast(length as float)) as avg1, 
sum(cast(length as float))/sum(case length when 0 then 0 else 1 end) as avg2 
from cte; 

with cte as (select * from (values (1), (2), (1)) as l(length)) 
select avg(cast(length as float)) as avg1, 
sum(cast(length as float))/sum(case length when 0 then 0 else 1 end) as avg2 
from cte; 

注意案例条件。我用“不是零”,你说“大于零”。你选。