在SQL中取平均值忽略小于0的所有值

时间:2015-06-08 17:05:44

标签: sql sql-server tsql

如果不使用@TempTables,如何在忽略任何小于零的情况下获得列的平均值?我试过这个,认为它只会将小于零的值设置为0,但如果一个值为< 0则将其设置为0。

[AverageCost]=avg(case when [Cost]>0 then [Cost] else 0 end)

编辑:为了澄清,我已经尝试在WHERE子句中排除它们,但有些列有正值和负值。这使得查询排除了具有总体负平均值的列,而在执行平均值时它应该仅拒绝负值。因此,如果列的值为-20,-5,5,10,15,则平均值为10.

2 个答案:

答案 0 :(得分:6)

SELECT 
[AverageCost] = AVG(cost)
FROM tablename
WHERE
cost > 0

答案 1 :(得分:5)

假设您可以限制整个查询(目前还不完全清楚),您可以这样做:

DECLARE @AverageCost int;
SELECT @AverageCost = AVG(Cost)
FROM TableName
WHERE Cost > 0

你的答案可能会看起来像这样,无论如何 - 例如,首先设置变量然后运行整个查询:

UPDATE SomeOtherTable
SET AverageCost = @AverageCost, AnotherField = FieldB
FROM TableName
-- now we don't have to exclude negative values.

或者,您可以保留与您所拥有的相近的东西:

SELECT AVG(CASE WHEN Cost > 0 THEN Cost ELSE NULL END)
FROM TableName

这会产生类似的效果而不会限制整个查询 - 但请注意差异,NULL而不是0(想想0中的平均值与跳过值之间的差异)。