如果不使用@TempTables,如何在忽略任何小于零的情况下获得列的平均值?我试过这个,认为它只会将小于零的值设置为0,但如果一个值为< 0则将其设置为0。
[AverageCost]=avg(case when [Cost]>0 then [Cost] else 0 end)
编辑:为了澄清,我已经尝试在WHERE子句中排除它们,但有些列有正值和负值。这使得查询排除了具有总体负平均值的列,而在执行平均值时它应该仅拒绝负值。因此,如果列的值为-20,-5,5,10,15,则平均值为10.
答案 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中的平均值与跳过值之间的差异)。